У меня есть массив обещаний, которые я разрешаю с помощью 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.all
возвращает первую найденную ошибку (игнорируя остальные), а затем я не могу получить данные из остальных обещаний. в массиве (это не ошибка).
Я пробовал делать что-то вроде ..
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();
});
Но это не решает.
Спасибо!
--
Редактировать:
Ответы ниже были полностью правдой, код ломался по другим причинам. Если кому-то интересно, это решение, к которому я пришел ...
Цепочка серверов Node Express
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.allSettled()
с приличной поддержкой. См. справочник. 09.04.2020Promise.all
выходит из строя, когда выходит из строя первый поток. Но, к сожалению, все остальные потоки продолжают работать, пока не закончатся. Ничего не отменяется, даже хуже: нет возможности отменить поток вPromise
. Итак, что бы потоки ни делали (и ни манипулировали), они продолжают, они меняют состояния и переменные, они используют ЦП, но в конце они не возвращают свой результат. Вы должны знать об этом, чтобы не создавать хаоса, например при повторении / повторном вызове. 09.05.2020