【问题标题】:handle promise error first level inside try catch处理 try catch 内的第一级承诺错误
【发布时间】:2018-08-01 13:49:27
【问题描述】:
function testPromise(id) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            if (typeof id === 'number') {
                resolve(id);
            } else {
                reject('error');
            }
        }, 500);
    }
    );
}
async function test(){
  try{
    testPromise(10)
    for(let i=0 ; i<10000; i++){
      ....
    }
    .
    .
  }catch(err){
    console.log(err)
  }
}
test();

好的考虑上面的代码我想异步运行testPromise函数所以如果我使用await语法testPromise(10)先运行然后for循环代码运行如果我不使用await,testPromise(10)异步运行一切都很好但是,现在,如果 testPromise 遇到错误,我应该如何处理?有什么方法可以使用 async-await 结构并在 try-catch 结构中处理此错误?
我知道我可以使用 catch 函数 testPromise(10).catch(err =&gt;{}); 来处理错误,但我想知道在我的第一级 try-catch 中是否有任何方法来处理它

【问题讨论】:

标签: javascript async-await es6-promise ecmascript-2017


【解决方案1】:

你不能。

您可以将try-catchawait 一起使用,或者在promise 上使用catch

您应该考虑到即使您的函数 (test) 已经完成执行,也可能引发错误。

有关正确示例,请参阅@Bergi 的答案。

【讨论】:

  • 这可能会导致未处理的承诺拒绝。不要那样做。
  • 如果testPromise(10) 被拒绝并且从循环代码中抛出一个异常以便不评估await,则被拒绝的promise 悬空。跨度>
  • 是的,同步代码也可以抛出异常。
  • 双重 try/catch 现在似乎毫无意义,只有到那时你才会将外部的放在 await promise 周围。并注意unhandled rejections can still happenpromise 拒绝而循环中的代码awaits 其他东西时。
【解决方案2】:

如果您想与循环同时运行它并正确处理 both 中的错误(这必然包括等待两者),那么Promise.all 是您唯一的选择:

async function test() {
  try {
    await Promise.all([
      testPromise(10),
      (async function() {
        for (let i=0; i<10000; i++) {
          …
        }
        …
      }())
    ]);
  } catch(err) {
    console.log(err);
  }
}

【讨论】:

  • 这是一个很好的解决方案,但是,我认为它使我的代码看起来很丑:)
  • @Daniel.V 最好为循环部分做一个单独的函数声明,而不是使用 AIIFE。不幸的是,这是唯一正确的解决方案:-)
猜你喜欢
  • 2020-08-17
  • 2016-09-30
  • 2018-12-13
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多