并行执行许多AJAX请求,并在所有这些请求完成后运行

the*_*ega 6 javascript ajax jquery json

我正在尝试使用HTML中的JQuery完成以下操作序列.

  • 构建了一个URL列表
  • 每个URL都是使用$ .getJSON(url)并行请求的
  • 等待所有请求完成或失败(可能发生404)
  • 获取所有已完成的JSON请求的数据并执行某些操作.

我构建了下面发布的Java脚本代码.它完美地工作,除非其中一个请求由于404错误而失败:然后,$.when不运行,因为它在请求失败时立即中止.你能以某种方式覆盖ajax请求,所以它们不会失败,而是返回一个空源?

我已经阅读了这篇文章这篇文章,但它没有提供一个解决方案,可以在所有查询完成后运行代码.

function fetchData() {
    queries = [];
    //urls is initialized somewhere else containing all urls
    for(var url in urls) {
        queries.push($.getJSON(url));
    }

    $.when.apply(this, queries).done(function() {
        console.log("Finished all queries, got "+arguments.length+" results");
        //Now arguments is a array containing the results of all requests
    }

    //function returns instantly, no problem!
 }
Run Code Online (Sandbox Code Playgroud)

Dem*_*cht 2

我可能会做这样的事情:

$(document).ready(function(){
    var _q = ['/echo/json/', '/echo/json/', 'mybadurl'];
    var _d = [];
    for(u in _q)
    {
        $.ajax({
            url: _q[u],
            success: function(data){
                pushData(data);
            },
            error: function(x){
                pushData(x);
            }
        });
    }

    function pushData(d)
    {
        _d.push(d);
        if(_d.length == _q.length)
        {
            alert('were done');
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

在这里,您将成功错误的数据推送到数组中_d,并进行测试以确保在继续之前已收到所有回复 ( alert('were done');)。

当然,您可以通过将包含操作状态的对象与有效负载一起推送到 中来使此操作变得更智能_d,但这是一个快速的组合,以演示我最有可能如何去做您所要求的事情。

在这里摆弄