2

使用 Backbone.js,我们有一个应用程序,在某些情况下我们需要向客户端 Web 服务发送一个 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);

有没有办法异步启动这些调用并仅在所有结果都在时才执行回调?

4

2 回答 2

8

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

你可以这样使用:

$.when(
   $.ajax({ url : 'url1' }),
   $.ajax({ url : 'url2' }) // or even more calls
).done(done_callback).fail(fail_callback);
于 2012-05-03T09:39:53.220 回答
0

我会做这样的事情:

创建一个函数,除了传递给 fetchData 的参数之外,它还获取 arrParams 中的索引,然后在循环中为每个元素调用该函数。在您的元素中处理的成功函数中,将您的元素设置为 true,并通过遍历数组来检查“您是否是最后一个”,并查看其余部分是否也为 true。

如果您制作一个计数器,可以进行一些优化:

var todo = arrParams.length;

并在您取得成功时:

if (--todo == 0) {
   callback(...)
}
于 2012-05-03T09:42:52.630 回答