打破promise.all on catch

时间:2016-07-02 09:36:30

标签: javascript promise ecmascript-6

我有一个承诺实现,就像MDN上的承诺:



    var p1 = new Promise((resolve, reject) => {
        setTimeout(resolve, 1000, "one");
    });
    var p2 = new Promise((resolve, reject) => {
        setTimeout(resolve, 2000, "two");
    });
    var p3 = new Promise((resolve, reject) => {
        setTimeout(resolve, 3000, "three");
    });
    var p4 = new Promise((resolve, reject) => {
        setTimeout(resolve, 4000, "four");
    });
    var p5 = new Promise((resolve, reject) => {
        reject("reject");
    });
    
    Promise.all([p1, p2, p3, p4, p5]).then(value => {
        console.log(value);
    }, function(reason) {
        console.log(reason)
    });




这样可以快速捕捉错误:

  如果其中一个元素被拒绝且Promise.all快速失败,则

Promise.all被拒绝:如果您有四个承诺在timeout之后解决,并且一个立即调用reject ,然后Promise.all立即拒绝。

然而,promise内的功能不会停止运行。我想要的是,如果一个函数执行reject,其他函数将停止运行(防止向用户发送无用的消息)。

拒绝后继续运行的承诺示例:



var p1 = new Promise((resolve, reject) => {
    setTimeout(resolve, 1000, "one");
});
var p2 = new Promise((resolve, reject) => {
    setTimeout(resolve, 2000, "two");
});
var p3 = new Promise((resolve, reject) => {
    setTimeout(resolve, 3000, "three");
});
var p4 = new Promise((resolve, reject) => {
    setTimeout(() => {
        console.log('Don\'t show this after a reject!');
        resolve();
    }, 4000);
});
var p5 = new Promise((resolve, reject) => {
    reject("reject");
});

Promise.all([p1, p2, p3, p4, p5]).then(value => {
    console.log(value);
}, function(reason) {
    console.log(reason)
});




1 个答案:

答案 0 :(得分:4)

承诺中没有任何通用可以做到这一点,因为停止其他操作是特定于操作的,而不是通用的。例如,在您的示例中,您必须保留计时器句柄,然后使用clearTimeout;使用ajax请求,您可能需要进行abort调用;与其他东西,它将是别的东西。

因此,您需要在实际代码中以特定于您的实际代码的方式处理此问题,使用.catchPromise.all返回的承诺(或第二个arg {{1}如你所愿)。

在你问题的具体代码中,它看起来像这样(我已经将输出添加到我们也没有取消的定时器),但是它会根据你取消的内容而变化:

then