【问题标题】:How to correctly trap and read any errors generated in a Promise.all call? [duplicate]如何正确捕获和读取 Promise.all 调用中生成的任何错误? [复制]
【发布时间】:2019-07-21 17:06:57
【问题描述】:

我目前有一个 node.js/graphql 微服务,它使用 Promise.all 通过 apolloFetch 调用另一个微服务。我的 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 数据库错误,以便我可以测试这个函数以确保所有数据库错误都被捕获?

【问题讨论】:

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


    【解决方案1】:

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

    简单地说,这里不需要数组,因为没有出现多个异常的情况。

    如果你真的想要一个类似 “链” 的逻辑,你应该看看 Observables。您可以使用rxjsPromises 转换为Observables,更具体地说,使用catchErrorswitchMap 运算符

    【讨论】:

    • 感谢您的解释;使用 rxjs 等问题对我来说不是一个选择,因为我不想使用额外的库或包。我是否没有其他选择来实现执行所有承诺的目标,即使存在/存在错误,然后将这些错误记录到数组中,然后再记录到数据库中?
    • 还有其他方法,但这样做是一种反模式。如果你真的想,你可以look here
    猜你喜欢
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    • 2015-03-31
    • 2011-10-12
    • 2020-11-16
    相关资源
    最近更新 更多