Прослушиватель событий для функции JS - PullRequest
0 голосов
/ 25 февраля 2020

Можем ли мы знать, когда функция JS будет завершена? Пример: у меня есть функция с длительным процессом, и я хотел бы отслеживать процесс или хотя бы знать, когда он завершится.

1 Ответ

0 голосов
/ 26 февраля 2020

Есть несколько способов узнать, когда функция закончила работу.

Синхронные функции

Если рассматриваемая функция выполняется полностью синхронно, то код, вызвавший функцию, будет ждать, пока это делается перед выполнением. Например:

function a() {
    // do something
}

function b() {
    a();
    console.log("a is done"); // will only run once a is finished
}

Асинхронные функции

Обещания в JavaScript - это еще один способ выполнить эту задачу, и они работают даже при наличии асинхронных вызовов - например, запросы к серверу и т. д. c. Для начала вы заставляете первую функцию возвращать обещание:

function a() {
    return new Promise((resolve, reject)=>{
        // do something
        resolve(); // once we're done, resolve the promise
    });
}

Конструктор обещания принимает функцию, которая принимает два аргумента, resolve и reject, которые передаются ей JavaScript , Вы можете вызвать функцию resolve(), когда закончите обработку, и функцию reject(), если столкнетесь с какой-либо ошибкой, которая означает, что вы не можете ее устранить.

Чтобы использовать это, вы можете сделать что-то подобное :

function b() {
    a().then(()=>{
         console.log("a is done"); // will only run once a is finished
    });
}

Приятно, что выполнение обещания заключается в том, что весь другой код может продолжать выполняться - за обещанием ничего не блокируется, кроме анонимной функции, которую вы передаете в метод then. Это определенно подход, который я бы выбрал для чего-то подобного.

Мониторинг прогресса / ведение журнала

Что касается мониторинга прогресса функции, то это действительно зависит от того, как функция работает. Лучше всего, вероятно, делать вызовы какой-либо функции регистрации, когда длинная функция достигает определенных частей. Например:

function a() {
    // do something
    console.log("did something");
    // do something else
    console.log("done");
}

Если вы не можете изменить функцию a() по какой-либо причине, нет хорошего способа сделать это (насколько мне известно), если только вы не знаете, что она изменяет некоторую глобальную переменную и вы можете проверить это на предмет изменений, но такой подход был бы довольно хитрым и определенно не хорошим способом сделать что-либо.

Заключение

Не так уж много чего я могу сказать не зная, какую функцию / процесс вы хотите отслеживать, есть, например, специальных способов для проверки хода загрузки файла, которые я здесь не освещал.

Аналогично Если процесс происходит на другом сервере или устройстве, эти методы вообще не будут работать - вам, вероятно, придется проверить WebSockets или (что более вероятно) Отправленные сервером события чтобы получать обновления прогресса для этих задач.

...