我有许多异步任务需要完成,所以我使用了 promises。
我需要检测每个 promise 何时执行(解决和拒绝)。在那之前我不能继续执行。
我正在使用这样的东西:
$.when(promise1, promise2, ...).always();
但是这段代码是错误的,因为 when
方法有惰性求值,一旦其中一个 promise 失败它就会返回。因此,always
回调也会在其中一个 promise 失败时立即运行。
我在考虑编写一个解决方法,但这个用例太常见了,也许有人已经这样做了,或者甚至有一种方法可以只使用 jQuery 来做到这一点(如果没有,最好添加一个 Promise.whenNonLazy
或将来的 Promise.when(promise1, promise2, ..., false)
。
这可能吗?
最佳答案
更复杂的 promise 库有一个 allSettled()
function like Q
或 Promise.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/