承诺的动态序列(Q)永远不会捕获

时间:2015-05-20 14:52:40

标签: javascript promise q

我有许多承诺(使用Q),我想按顺序呼叫,这是我的代码:

// All the promises are called sequentially
            var result = promises.reduce(function(promise, item) {
                return promise.then(function () {
                    var obj = toPush.shift();
                });
            }, Q());

            // Check the result
            result.then(function() {
                // Do something if all of the promises full
            }).catch(function() {
                // Do something if ONE of the promise is rejected and stop the others
            }).finally(function() {
                App.network.stopLoader();
            });

promises是一个承诺数组(回调函数)

它很有效,所有的承诺都按顺序完成,但是当一个承诺被拒绝时,它仍然会进入then函数而不是catch。 为什么?

我用过这个:Break a dynamic sequence of promises with Q

感谢您的帮助:)

2 个答案:

答案 0 :(得分:0)

永远不会调用catch的原因是因为你不会在代码的这一部分返回任何内容:

return promise.then(function () {
    var obj = toPush.shift();
});

相反,你应该尝试:

return promise.then(function () {
    return toPush.shift();
});

如果你这样做:

result.then(console.log)

你应该总是看到未定义,但它不会被抓住。

希望这有帮助!

答案 1 :(得分:0)

看起来你只想要Q.all:

CalendarIframe

根据documentation,一旦数组中的任何承诺被拒绝,所有人返回的承诺将被拒绝。 (与在解决返回的promise之前等待解析所有promise的allSettled相反)。