Несколько аякс-вызовов из массива и обработки обратного вызова при завершении
Я использовал 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);
});