javascript - $.递延 : How to detect when every promise has been executed

标签 javascript jquery asynchronous promise jquery-deferred

我有许多异步任务需要完成,所以我使用了 promises。

我需要检测每个 promise 何时执行(解决和拒绝)。在那之前我不能继续执行。

我正在使用这样的东西:

$.when(promise1, promise2, ...).always();

但是这段代码是错误的,因为 when 方法有惰性求值,一旦其中一个 promise 失败它就会返回。因此,always 回调也会在其中一个 promise 失败时立即运行。

我在考虑编写一个解决方法,但这个用例太常见了,也许有人已经这样做了,或者甚至有一种方法可以只使用 jQuery 来做到这一点(如果没有,最好添加一个 Promise.whenNonLazy 或将来的 Promise.when(promise1, promise2, ..., false)

这可能吗?

最佳答案

更复杂的 promise 库有一个 allSettled() function like QPromise.settle like Bluebird .

在 jQuery 中,您也可以自己实现这样的功能,并用它扩展 $ 命名空间,但这只有在您经常需要它并且性能经过优化时才有必要。

一个更简单的解决方案是为您正在等待的每个 promise 创建一个新 promise ,并在基础 promise 被拒绝时履行它们。然后你可以毫无问题地对它们使用 $.when() 。简而言之:

// using Underscore's .invoke() method:
$.when.apply(null, _.invoke(promises, "then", null, $.when)).done(…)

更稳定:

$.when.apply($, $.map(promises, function(p) {
    return p.then(null, function() {
        return $.Deferred().resolveWith(this, arguments);
    });
})).then(…);

您可以稍微更改 then 回调,以区分最终 done 中已完成和已拒绝的结果。

关于javascript - $.递延 : How to detect when every promise has been executed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19177087/

相关文章:

javascript - 最近五个月的数组

javascript - 有没有一种方法可以在 li 元素上使用多个操作?

c# - java脚本到C#的回调,c#和java脚本之间的异步编程

javascript - 如何使大文本字段的文本框变宽

javascript - Angularjs ng-model 未绑定(bind)到隐藏输入

javascript - 找到附加内容的正确位置

jquery - 让视差在 iPad 上运行

jquery - UserPicker 输入元素,如 GMAIL

ios - 从 URL Swift 异步下载和上传数据

javascript - 如何实现 Typescript 异步等待模式 : Where is the Promise