Как узнать, когда заканчиваются асинхронные функции

У меня есть функция, которая несколько раз вызывает асинхронную функцию в цикле.

function myFunc() {
    var things = [1, 2, 3, 4, 5];

    $.each(things, asyncFunc);

    alert('Things ' + things.join() + ' have all been processed.');
}

function asyncFunc(key, value) {
    $.post('api.php', value: thing);
}

Я хочу продолжить только после завершения всех асинхронных вызовов.

Я мог бы заставить asyncFunc возвращать отложенный объект и вызывать .resolve() в методе $.post.done, но тогда как я мог бы заблокировать цикл .each и продолжить только после завершения asyncFunc?

Какие еще есть способы продолжить работу только после завершения всех вызовов asyncFunc?


person Chris Watts    schedule 19.08.2013    source источник


Ответы (1)


  1. Передайте обратный вызов в asyncFunc
  2. В обратном вызове используйте счетчик на основе things.length
  3. Подсчитайте, сколько раз был вызван обратный вызов
  4. Если счетчик показывает, что осталось пройти больше, завершите обратный вызов.
  5. Если счетчик показывает, что это последний раз, продолжайте вызов

например перезвонить

var count = things.length,
    callback = function () {
        if (0<--count) return;
        // do stuff
    };
person Paul S.    schedule 19.08.2013
comment
Ах, мило. У меня уже есть обратный вызов в asyncFunc, поэтому я просто добавил дополнительный обратный вызов в конец текущего обратного вызова. В любом случае, не могли бы вы показать в своем ответе весь рабочий код для новых людей? - person Chris Watts; 19.08.2013