在 Promise.all 中使用 Try/Catch

tom*_*894 6 javascript node.js async-await

我最近一直在阅读有关 async/await 并使用 try 和 catch 来处理承诺拒绝的内容,并将其应用于我的一些旧代码。

我有以下几点:

async function() {
    try {
        await Promise.all([some functions]);
        doIfNoError();
    } catch (error) {
        console.log(error);
    }
Run Code Online (Sandbox Code Playgroud)

我传递给 Promise.all 的函数遵循以下形式:

async function() {
    some code
    if (some condition) {
        return true
    } else {
        throw false
    }
 }
Run Code Online (Sandbox Code Playgroud)

我打算如果任何传递给 Promise.all 的函数被拒绝,就会显示拒绝。如果没有一个函数拒绝,那么 doIfNoError 应该触发。但是,doIfNoError 有时会在不应该触发时触发,并且我会收到错误“未处理的承诺拒绝”。

Ple*_*mor 5

事实上,try/catch没有工作Promise.all()

这是一个片段来证明它:

async function p1() {
  return 1;
}
async function boom() {
  throw new Error('boom');
}

// expected output: 'boom', ["value before Promise.all"]
async function asyncCall() {
  let all = ['value before Promise.all'];
  try {
    all = await Promise.all([p1(), boom()]);
  } catch(e) {
    console.log(e.message);
  }
  console.log(JSON.stringify(all));
}

asyncCall();
Run Code Online (Sandbox Code Playgroud)


B12*_*ter 2

1) throw false\xe2\x80\x93 这没有意义,你不应该抛出一个布尔值,而应该抛出一个实例Error

\n\n

2)catch仅在抛出错误或promise被“拒绝”时触发(注意:reject和throw与async-await具有相同的效果)。相比之下:“解析”布尔值为 的 Promisefalse不会被 async-await 解释为异常。因此,如果您希望 catch 块启动,请确保您出现throw错误或拒绝reject承诺。如果您将异常作为参数传递给拒绝,例如 ( Promise.reject(new Error("Something went wrong"))

\n\n

除了我上面提到的之外,您的代码看起来不错。

\n

  • 你_可以_抛出任何东西,但是确实没有合理的理由抛出任何非错误的东西。 (6认同)