首页 > 解决方案 > 拒绝 Promise.all

问题描述

我有一个 aysnc 函数,它获取数据并返回Promise.allie的值

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' && 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;
}

但它永远不会被捕获。为什么是这样?如果所有的承诺都没有解决,我如何让它拒绝?

谢谢

标签: reactjsasync-awaites6-promisepromise.all

解决方案


您不是在拒绝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.
    }
  })

推荐阅读