使用jQuery.each获取多个ajax,当(jQuery.when)完成所有操作时

时间:2013-09-03 10:41:28

标签: javascript jquery ajax each .when

我希望有一个函数接受一个url数组作为参数,然后异步下载每个url的json,并且当所有这些都完成后执行一些函数。

首先,我有一个函数返回ajax以获取一个url(延迟/ promise对象)。

function get_json(url) {
    /* Asynchronously download data of type json */
    return $.ajax({url: url,
                   dataType: 'json'});
}

执行以下工作:

var url = 'http://data.hisparc.nl/api/station/501/';
get_json(url).done(function(data){console.log(data)});

所以,现在我希望能够提供一系列网址,然后能够在完成后附加完成后做一些事情。我想出了这个:

function get_multiple_json(urls) {
    /* Asynchronously download multiple urls of type json */
    return $.when($.each(urls, function(i, url) {return get_json(url);}));
}

所以我认为这有效:

var urls = ['http://data.hisparc.nl/api/station/501/',
            'http://data.hisparc.nl/api/station/505/'];
get_multiple_json(urls).done(function() {alert('hi')});

但是在ajax完成之前抛出警报,似乎$ .each不会返回延迟对象。

那我该怎么做呢?

2 个答案:

答案 0 :(得分:2)

使用$.map代替$.each

var urls = ['http://data.hisparc.nl/api/station/501/',
            'http://data.hisparc.nl/api/station/505/'];

$.when.apply(null, urls.map(function (url) {
    return $.ajax({ url: url, dataType: 'json' });
})).then(function () {
   alert("hi");
});

答案 1 :(得分:0)

(function($) {
    var arrTest = ['http://data.hisparc.nl/api/station/501/',
               'http://data.hisparc.nl/api/station/505/'];
    $(arrTest).each(function(intIndex, strElem) {
        var objJson = $.getJSON(strElem);
        $(objJson).each(function(intIndex, strElem) {
           // do parsing here
        });
    });
})(jQuery);

这应该有所帮助。