Несколько аякс-вызовов из массива и обработки обратного вызова при завершении

Я использовал promises в jQuery чуть раньше - но у меня возникают проблемы с его применением к этому сценарию. Для этого я предпочитаю использовать методы $.when() и $.done().

Из того, что я понимаю, мне нужно создать объект $.Deferred, который регистрирует запросы и когда эти запросы будут завершены - вызовите обратный вызов. В моем коде ниже обратный вызов запускается перед запросами ajax, а не после - может быть, мне просто нужен сон

Я знаю, что мой код неполный. Я изо всех сил старался применить его с добавлением цикла for.

http://jsfiddle.net/whiteb0x/MBZEu/

var list = ['obj1', 'obj2', 'obj3', 'obj4', 'obj5'];
var callback = function() {
  alert("done");
};
var requests = [];

var ajaxFunction = function(obj, successCallback, errorCallback) {
  for(i = 0; i < list.length; i++) {
    $.ajax({
      url: 'url',
      success: function() {
            requests.push(this);
      }
    });
  }
};
$.when($.ajax(), ajaxFunction).then(function(results){callback()});

Ответы

Ответ 1

Аргументы $.when должны быть возвратным значением $.ajax, которое также не нужно вызывать отдельно - это не имеет смысла. Вы хотите что-то вроде этого:

for (i = 0; i < list.length; i++) {
   requests.push($.ajax(...));
}
$.when.apply(undefined, requests).then(...)

Причина, по которой требуется .apply, заключается в том, что $.when может принимать несколько аргументов, но не массив аргументов. .apply существенно расширяет:

$.when(requests[0], requests[1], ...)

Это также предполагает, что запросы могут быть выполнены в любом порядке.

http://jsfiddle.net/MBZEu/4/ - обратите внимание, что "done" записывается в консоль после всех успешных сообщений.

Ответ 2

Я рассказываю простой пример, который может помочь вам обрабатывать несколько запросов и их ответы:

var arr = [
    $.ajax({url:"test1.php"}),
    $.ajax({url:"test2.php"}),
    $.ajax({url:"test3.php"})
];
$.when.apply( undefined, arr ).then(function() {
    var objects=arguments;
    console.dir(objects);
});