Как использовать .promise(). Done() в $.each json array при завершении/завершении?

Я хочу выполнить некоторые действия при выполнении $.each.

$.each(someArray, function(index, val) {

    //---------some async ajax action here per loop ---------
    $.ajax({...}).done(function(data){...});

}.promise().done(function(){...}); //<-------error here can't use with $.each
  • Не каждая функция jQuery имеет promise()?
  • Как узнать, когда выполняется $. each?
  • Можно ли изменить someArray на $someArray, чтобы использовать его?

Ответ 1

Как вы поняли, $.each() не имеет .promise(), поэтому вы не можете сделать это так, как вы пытались. Вместо этого вы можете использовать $.when(), чтобы отслеживать, когда все связки promises, возвращаемые группой из функций Ajax, были решены:

var promises = [];
$.each(someArray, function(index, val) {
    //---------some async ajax action here per loop ---------
    promises.push($.ajax({...}).then(function(data){...}));
});
$.when.apply($, promises).then(function() {
    // code here when all ajax calls are done
    // you could also process all the results here if you want
    // rather than processing them individually
});

Или, вместо вашего $.each(), немного чище использовать .map():

$.when.apply($, someArray.map(function(item) {
    return $.ajax({...}).then(function(data){...});
})).then(function() {
    // all ajax calls done now
});