Есть несколько способов узнать, когда функция закончила работу.
Синхронные функции
Если рассматриваемая функция выполняется полностью синхронно, то код, вызвавший функцию, будет ждать, пока это делается перед выполнением. Например:
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 или (что более вероятно) Отправленные сервером события чтобы получать обновления прогресса для этих задач.