#reactjs #async-await #es6-promise #promise.all
#reactjs #асинхронный-ожидание #es6-обещание #promise.all
Вопрос:
У меня есть функция aysnc, которая извлекает данные и возвращает значение Promise.all
, т.е.
const fetchDownloadMenuData = async selectedItems => {
return Promise.all(
selectedItems.map(async item => {
try {
if (item.id === 'interviewGuide') {
const interviewGuide = await positionCandidatesService.getCandidate(
positionId,
candidateSelected.id
);
return interviewGuide.interviewGuide;
}
if (item.id !== 'overview' amp;amp; item.id !== 'profile') {
const outcome = await outcomesService.get(candidateSelected.id, item.id);
return outcome;
}
return null;
} catch (err) {
appInsights.trackException({
error: new Error(`Error fetching candidate outcome: ${JSON.stringify(err)}`)
});
return null;
}
})
)};
Я вызываю эту функцию следующим образом:
try {
downloadData = await fetchDownloadMenuData(selectedItems);
} catch (err) {
appInsights.trackException({
error: new Error(`Could not fetch all PDF data: ${JSON.stringify(err)}`)
});
return;
}
Но это никогда не попадает в catch. Почему это? Как мне заставить его отклонить, если все обещания не разрешаются?
Спасибо
Комментарии:
1. Я верю в ваш улов, вы должны отклонить обещание следующим образом:
Promise.reject()
в противном случае оно разрешит его
Ответ №1:
Вы не отклоняете в map...catch block
, вместо этого вы возвращаете null
. Вот почему Promise.all
не удается перехватить исключение. Помните, что вам нужно использовать throw
в блоке catch, throw
который завершит поток выполнения.
Попробуйте так
selectedItems.map(async item => {
try {
...async stuff
} catch (err) {
appInsights.trackException({
error: new Error(`Error fetching candidate outcome: ${JSON.stringify(err)}`)
});
throw err OR throw new Error(err) <-- this is missing earlier.
}
})