0

所以我有一个 Deferred objects 数组dataCalls

目前,我正在使用以下方法将它们全部触发,并在所有 Deferreds 解决后调用回调:

$.when.apply(null, dataCalls)
   .always(callback);

它工作正常。现在的问题是每个 Deferred in 都dataCalls同时触发。我怎样才能让它们连续开火-我正在考虑Deferred.then,以及以某种方式apply()设置的数组,then()但假设您从 Deferred 开始,而我没有。

我可能正在考虑循环遍历数组,并将每个 Deferred 对象传递给之前的 Deferredthen()方法。然后跟随:

$.when(dataCalls[0])
   .always(callback);

有任何想法吗?

编辑:

这是漫长的一天,让我清理这个问题,希望它对其他人有用。

与我第一次写的相反,我实际上有一个Deferred.promise()对象数组,dataCalls.

然后将其传递到:

$.when.apply(null, dataCalls)
   .always(callback);

以便在解决所有承诺时调用回调。

由于返回每个 Promise 的 Deferred 对象已经被调用,并且(在其他未显示的代码中)该过程非常快,因此每个 Deferred 都同时运行。

为了让 Deferreds 连续触发,我需要创建一个数组,数组中的每个对象都是一个返回上述承诺的函数。

然后我可以遍历数组,执行返回 promise 的函数,然后将数组中的下一个对象传递给 promise 的 .then() 方法,这将导致函数在 promise 被解析时被调用。

然后可以将最后一个 promise 传递回$.when(promise).always(callback);.

4

1 回答 1

2

循环遍历它们,将每个传递到 .then

var reqArr = [{url: "somepage.php"},{url: "somepage1.php"},{url: "somepage2.php"}];

var req = $.ajax(reqArr.shift());
$.each(reqArr,function(i,obj){
    req.then(function(){
        return $.ajax(obj);
    });
});

req.done(function(){
    //They are all done!
});
于 2013-10-22T17:42:16.370 回答