如何正确捕获和读取Promise.all调用中生成的任何错误?

时间:2019-02-27 21:13:41

标签: javascript node.js try-catch es6-promise

我目前有一个使用Promise.all通过apolloFetch调用另一个微服务的node.js / graphql微服务。我的Promise.all部分似乎工作正常,但我正在尝试使错误记录部分正常工作。我需要确保Promise.all执行所有承诺,并且在遇到第一个错误后不会退出。一旦执行了所有的承诺,我就需要填充一个仅表示错误的数组,然后遍历并使用另一个函数将其插入数据库。目前,我已经设置了数组和catch,但是当我有意产生错误时,我看不到数组被填充。

如果我的代码确实在执行我打算执行的操作,有人可以帮忙吗?

     const ErrorsArray = [];
     Promise.all(promises.map(p => apolloFetch({p}))).then((result) =>                         

          {
                resolve();
                console.log("success!");
            }).catch((e) => {
                ErrorsArray.push( e );
            });
     if( ErrorsArray && ErrorsArray.length ){
        for(a=0;a<ErrorsArray.length;a++){
          funcLogErrors( ErrorsArray[a].errorCode,         
                         ErrorsArray[a].message );
         //Not sure if these are correct^^^^^^^^^
        }
      }

PS:另外,如何在不关闭数据库的情况下模拟mySQL数据库错误,所以我可以测试此功能以确保同时捕获所有数据库错误?

1 个答案:

答案 0 :(得分:1)

您的ErrorsArray将始终包含最多一个错误。这是因为Promise.all要么解决所有承诺,要么在遇到第一个错误后失败(并拒绝)。

简而言之,这里不需要数组,因为在任何情况下都不会出现多个异常。

如果您真的想拥有“链” 之类的逻辑,则应研究 Observables 。您可以使用rxjsPromise转换为Observable,更具体地说,可以使用catchErrorswitchMap运算符