Javascript:在x个异步数据库/ ajax调用之后,有没有更好的方法来执行函数

San*_*der 2 javascript asynchronous backbone.js underscore.js

使用Backbone.js我们有一个应用程序,在某些情况下我们需要向客户端webservice发送ajax帖子.

但是,要发布的内容是动态的,并且由某个数组决定.

对于数组中的每个项目,我们需要获取一段数据.

在汇总需要发送聚合对象的数据之后.

截至目前,我有一个同步方法,虽然我觉得这不是最好的方法.

var arrParams = [{id: 1, processed: false},{id: 7, processed: false},{id: 4, processed: false}];

function callback(data) {
    $.post()... // jquery ajax to post the data... }

function fetchData(arr, data, callback) {
    var currentId = _(arr).find(function(p){ return p.processed === false; }).id;  // getting the ID of the first param that has processed on false...

    // ajax call fetching the results for that parameter.
    $.ajax({
        url: 'http://mysuperwebservice.com',
        type: 'GET',
        dataType: 'json',
        data: {id: currentId},

        success: function(serviceData) {
            data[currentId] = serviceData;  // insert it into the data
            _(arr).find(function(p){ return p.id === currentId; }).processed = true; // set this param in the array to 'being processed'.
            // if more params not processed, call this function again, else continue to callback
            if(_(arr).any(function(p){ return p.processed === false }))
            {
                 fetchData(arr, data, callback);
            }
            else
            {
                callback(data);
            }
        },
        error: function(){ /* not important fr now, ... */ }
    }); 
}

fetchData(arrParams, {}, callback);
Run Code Online (Sandbox Code Playgroud)

是不是有办法异步启动这些调用并仅在所有结果都在的情况下执行回调?

Den*_*lin 8

您必须使用JQuery $.Deferred对象来同步它们.看看这篇文章Deferred Docs

你可以这样使用:

$.when(
   $.ajax({ url : 'url1' }),
   $.ajax({ url : 'url2' }) // or even more calls
).done(done_callback).fail(fail_callback);
Run Code Online (Sandbox Code Playgroud)