Javascript 等待多个承诺被拒绝
做一些测试,我需要等待一些承诺被拒绝Javascript 等待多个承诺被拒绝,javascript,jquery,jquery-deferred,Javascript,Jquery,Jquery Deferred,做一些测试,我需要等待一些承诺被拒绝 var p1 = connection.doCall(); var p2 = connection.doCall(); Promise.settle([p1, p2]).then(function(results) { var allRejected = results.every(function(item) { return item.isRejected(); }); // act on allRejected
var p1 = connection.doCall();
var p2 = connection.doCall();
Promise.settle([p1, p2]).then(function(results) {
var allRejected = results.every(function(item) {
return item.isRejected();
});
// act on allRejected here
});
我知道我可以使用jQuery.when()等待几个问题得到解决。但一旦其中一个承诺失败,这种方法就会拒绝主承诺
我知道我所有的承诺都会失败,但我还是需要等待。我怎么做
在一种伪代码中,我想做的是:
var promise1 = connection.doCall();
var promise2 = connection.doCall();
$.when([promise1, promise2]).allOfThemFail(function() {
assertThatSomeProcessWasDoneOnlyOnce()
});
我不认为有一个内置的功能,但你可以很容易地实现
var promise1 = connection.doCall();
var promise2 = connection.doCall();
allOfThemFail([promise1, promise2]).always(function () {
assertThatSomeProcessWasDoneOnlyOnce()
});
function allOfThemFail(array) {
var count = 0;
len = array.length, failed = false, deferred = $.Deferred();
$.each(array, function (i, item) {
item.fail(fail).always(always);
})
function always() {
if (++count == len) {
if (failed) {
deferred.reject();
} else {
deferred.resolve();
}
}
}
function fail() {
failed = true;
}
return deferred.promise();
}
使用Bluebird promise库,您可以使用
promise.solite()
,它等待所有承诺得到解决(例如,履行或拒绝),然后您可以简单地查询列表以查看它们是否都被拒绝
var p1 = connection.doCall();
var p2 = connection.doCall();
Promise.settle([p1, p2]).then(function(results) {
var allRejected = results.every(function(item) {
return item.isRejected();
});
// act on allRejected here
});
以下是特定于jQuery的
solite()
:
并且,您将使用与蓝鸟解决方案类似的方法:
var p1 = connection.doCall();
var p2 = connection.doCall();
$.settle([p1, p2]).then(function(results) {
var allRejected = results.every(function(item) {
return item.isRejected();
});
// act on allRejected here
});
这里有一个
solite()
类型的函数使用标准ES6从零开始构建。它返回一个单独的承诺,当所有其他承诺都完成时(无论其最终状态如何),该承诺将得到解决。此uber promise的解析结果是一个PromiseInspection
对象数组,您可以在其中查询IsCompleted()
或isRejected()
,并可以获得.value()
或.reason()
并且,您可以使用与上面类似的方法:
var p1 = connection.doCall();
var p2 = connection.doCall();
Promise.settle([p1, p2]).then(function(results) {
var allRejected = results.every(function(item) {
return item.isRejected();
});
// act on allRejected here
});
谢谢你推荐蓝鸟,那是一个很棒的图书馆。和+1用于使用ES6承诺结算实施@aron-p-johny answer值得一提,因为它是使用jQuery承诺实现的,不依赖于其他库,也不依赖于几乎最前沿(2015年年中)的功能。进行了一些编辑,以处理零长度承诺数组或非承诺(例如,仅值)的情况在数组中传递。添加了特定于jQuery版本的
$.solite()
。更新了标准Promise实现,以与其他两个实现相同的方式工作,并使用Promise.all()
在内部完成其工作,而不是编写我们自己的承诺跟踪逻辑。$。当
不接受数组时,如果您的一个承诺没有失败怎么办;您希望承诺链选择成功路径还是错误路径?
var p1 = connection.doCall();
var p2 = connection.doCall();
Promise.settle([p1, p2]).then(function(results) {
var allRejected = results.every(function(item) {
return item.isRejected();
});
// act on allRejected here
});