Динамические множественные отложенные вызовы jQuery Ajax

Использование шаблона Deferred из jQuery http://api.jquery.com/jQuery.when/ , я пытаюсь сделать несколько вызовов jsonp ajax и дождаться результатов, прежде чем перейти к следующему шагу. Я могу сделать это, используя фиксированное количество вызовов, потому что я могу установить количество разрешаемых параметров аргумента в отложенном объекте ".done()". Но в моем приложении это не работает, потому что количество вызовов динамическое и всегда неизвестное.

Этот первый упрощенный пример работает, потому что я могу установить количество аргументов в разрешенной функции .done(). Я знаю, что мне нужно два, потому что в .when() есть два вызова:

$.when( $.ajax( url1 ), $.ajax( url2 ) ).done(function( a1, a2 ) {  
    var data = a1[ 0 ] + a2[ 0 ]; 
});

Это то, что мне нужно, но не могу заставить его работать:

var urls = GetUrlList(); // returns array of urls to json service
var requests = []; // hold ajax request
for (i = 0; i < urls.length; i++) {
    requests.push($.ajax(url[i]));
}

$.when.apply($, requests).done(function ("what goes here?") {
    // Need to get the data returned from all ajax calls here
});

Спасибо за любую помощь в этом!


person Xay Xayay    schedule 27.10.2013    source источник


Ответы (1)


Вы можете использовать аргументы, которые являются особым королем объектов хранение всех аргументов, переданных функции

$.when.apply($, requests).done(function () {
    console.log(arguments); //it is an array like object which can be looped
    var total = 0;
    $.each(arguments, function (i, data) {
        console.log(data); //data is the value returned by each of the ajax requests

        total += data[0]; //if the result of the ajax request is a int value then
    });

    console.log(total)
});
person Arun P Johny    schedule 27.10.2013
comment
Это хорошо работает, когда у вас есть как минимум два запроса на отправку. В противном случае вы получите непоследовательное поведение, когда это один запрос или несколько :( - person Happynoff; 29.09.2016
comment
ссылка на аргументы устарела и указывает на устаревшую функцию. обновленная ссылка - person Liam; 05.01.2017
comment
это не идеально. Я вызвал это с 1 аргументом, но пришло 2 аргумента, из которых второй — строковый литерал success - person phil294; 27.07.2017