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
});