Q.fail 使用 Q.allSettled 时不工作

Q.fail not working when using Q.allSettled

使用Q.allSettled时,无法使用Q.fail得到错误

如果我有 promises 其中包含最终被拒绝的承诺,则此代码永远不会进入 .fail

Q.allSettled(promises)
    .then(function () {
        // Handle success
    })
    .fail(function (err) {
        console.log('IN ERRR', err);
    });
});

.allSettled 的文档以这个为例:

Q.allSettled(promises)
.then(function (results) {
    results.forEach(function (result) {
        if (result.state === "fulfilled") {
            var value = result.value;
        } else {
            var reason = result.reason;
        }
    });
});

.allSettled 函数的这种预期行为是否不会进入 .fail 块?

是的,.allSettled() 返回的承诺由所有结果的数组实现,无论它们是实现还是拒绝。

如果返回的 promise 以某种方式导致进入 .then() 处理程序 .fail() 处理程序,那么这将导致一些非常混乱的程序流程并且会违反承诺契约。

如果你愿意,你可以这样做:

Q.allSettled(promises)
.then(function (results) {
    results
        .filter(function (result) { 
            return result.state === "fulfilled"; 
        })
        .forEach(function (result) {
            // handle each success
        });

    throw results.filter(function (result) {
        return result.state !== "fulfilled";
    });
})
.fail(function (err) {
    console.log('IN ERRR', err);
});