Отклонение от Promise.all

#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.
    }
  })