【发布时间】: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