处理Promise.all中的错误

我有一系列要解决的承诺 Promise.all(arrayOfPromises);

我继续继续诺言链。看起来像这样

existingPromiseChain = existingPromiseChain.then(function() {

var arrayOfPromises = state.routes.map(function(route){

return route.handler.promiseHandler();

});

return Promise.all(arrayOfPromises)

});

existingPromiseChain = existingPromiseChain.then(function(arrayResolved) {

// do stuff with my array of resolved promises, eventually ending with a res.send();

});

我想添加一个catch语句来处理单个promise,以防万一出错,但是当我尝试时,Promise.all返回它发现的第一个错误(忽略其余的),然后我无法从其余的promise中获取数据数组(没有错误)。

我尝试做类似..

existingPromiseChain = existingPromiseChain.then(function() {

var arrayOfPromises = state.routes.map(function(route){

return route.handler.promiseHandler()

.then(function(data) {

return data;

})

.catch(function(err) {

return err

});

});

return Promise.all(arrayOfPromises)

});

existingPromiseChain = existingPromiseChain.then(function(arrayResolved) {

// do stuff with my array of resolved promises, eventually ending with a res.send();

});

但这并不能解决。

谢谢!

-

编辑:

下面的答案完全正确,但代码由于其他原因而中断。如果有人感兴趣,这就是我最终得到的解决方案…

节点快速服务器链

serverSidePromiseChain

.then(function(AppRouter) {

var arrayOfPromises = state.routes.map(function(route) {

return route.async();

});

Promise.all(arrayOfPromises)

.catch(function(err) {

// log that I have an error, return the entire array;

console.log('A promise failed to resolve', err);

return arrayOfPromises;

})

.then(function(arrayOfPromises) {

// full array of resolved promises;

})

};


API调用(route.async调用)

return async()

.then(function(result) {

// dispatch a success

return result;

})

.catch(function(err) {

// dispatch a failure and throw error

throw err;

});

.catch用于Promise.all在之前.then似乎已经担任了从原来的承诺捕捉任何错误,但随后整个数组返回到下一个目的.then

谢谢!

回答:

Promise.all是全有还是全无。一旦阵列中的所有承诺都解决,它就会解决,或者一旦 其中一个

拒绝,就立即拒绝。换句话说,它要么使用所有已解析值的数组进行解析,要么使用单个错误进行拒绝。

有些库中有一个叫做的东西Promise.when,据我所知,它会等待数组中的 所有 promise解析或拒绝,但是我并不熟悉它,而且它不在ES6中。

我在这里同意其他人的观点,认为您的修复应该可以进行。它应使用可能包含成功值和错误对象混合的数组来解析。在成功路径中传递错误对象是不寻常的,但是假设您的代码期望它们,我认为它没有问题。

我能想到它“无法解决”的唯一原因是,它在代码中失败,您没有向我们显示;而您没有看到关于此的任何错误消息,是因为该诺言链没有以final结尾捕获(就您正在向我们展示的内容而言)。

我冒昧地从您的示例中排除了“现有链”,并以一条链来终止该链。这可能不适合您,但是对于阅读此书的人来说,始终返回或终止链很重要,否则潜在的错误(甚至编码错误)将被隐藏(这是我怀疑在这里发生的事情):

Promise.all(state.routes.map(function(route) {

return route.handler.promiseHandler().catch(function(err) {

return err;

});

}))

.then(function(arrayOfValuesOrErrors) {

// handling of my array containing values and/or errors.

})

.catch(function(err) {

console.log(err.message); // some coding error in handling happened

});

以上是 处理Promise.all中的错误 的全部内容, 来源链接: utcz.com/qa/433366.html

回到顶部