【问题标题】:jQuery Deferreds - Calling an array of Deferreds in successionjQuery Deferreds - 连续调用 Deferreds 数组
【发布时间】:2013-10-23 02:12:45
【问题描述】:

所以我有一个延迟对象数组dataCalls

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

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

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

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

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

有什么想法吗?

编辑:

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

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

然后将其传递到:

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

这样当所有的 Promise 都被解决时,回调就会被调用。

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

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

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

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

【问题讨论】:

  • 首先,您必须停止创建 dataCalls 数组。在您生成承诺对象数组时发送调用。向我们展示该代码。
  • @KevinB 好吧,有点愚蠢,我数组中的每个对象实际上都是一个返回 Deferred.promise() 的函数。然后将该数组当前传递给 $.when.apply(null, array);
  • 不,每个对象都是每个函数返回的承诺对象,否则 $.when 会立即解析而不是等待请求完成。 $.when 不执行函数。
  • @KevinB 是的,你是对的,对不起,数组中的每个对象都是一个承诺。我想是时候回家了哈哈。
  • 我会整理一个示例,假设您有一个 ajax 选项对象数组。

标签: javascript jquery asynchronous promise jquery-deferred


【解决方案1】:

循环遍历它们,将每个传递到 .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!
});

【讨论】:

  • 我明白你做了什么,但我已经将这个逻辑封装在 Deferred 中。我只有承诺。但是 Deferred 会在立即调用时执行,而 $.when 只是等待 promise 被解决,我相信,所以我认为我需要对我的代码进行相当多的重构。
  • 如果你有承诺,那么请求已经发送。所以,是的,您必须对其进行一些重构。
  • 我已经快速阅读了一遍,我认为我可以在循环遍历前一个 promise 时将一个 promise 传递到前一个 promise 的 then() 中,而不是构建数组。然后我可以将最后一个承诺传递给 $.when 目前。 - 使“传递提供承诺的功能”
  • 等等...你真的关心他们完成什么订单吗?以正确的顺序迭代结果就足够了吗?
  • 目前,它们被同时调用会导致服务器上的竞争条件。所以只要他们一个接一个地被调用,什么顺序都没有关系。
猜你喜欢
  • 2014-03-14
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
相关资源
最近更新 更多