在Promise.all中使用Try / Catch

时间:2018-12-30 20:36:49

标签: javascript node.js async-await

我最近一直在阅读有关异步/等待的信息,并使用try and catch处理承诺拒绝,并将其应用于我的一些旧代码中。

我有以下内容:

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

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

async function() {
    some code
    if (some condition) {
        return true
    } else {
        throw false
    }
 }

我打算,如果将任何函数传递给Promise.all拒绝,则显示拒绝。如果没有一个函数拒绝,则应该触发doIfNoError。但是,doIfNoError有时会在不该触发的情况下触发,并且出现错误“未处理的承诺拒绝”。

3 个答案:

答案 0 :(得分:2)

实际上,try/catchPromise.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();

答案 1 :(得分:0)

1)throw false –这没有道理,您不应抛出布尔值,而应抛出Error的实例。

2)catch仅在引发错误或“拒绝”了诺言时触发(注意:拒绝和引发same effect带有async-await)。相反,“解析”布尔值为false的promise不会被async-await解释为异常。因此,如果要插入捕获块,请确保您throw错误或reject承诺。如果您reject,请将异常作为参数传递给拒绝,例如(Promise.reject(new Error("Something went wrong"))

除了我上面提到的内容,您的代码看起来还不错。

答案 2 :(得分:0)

尝试最大程度地利用承诺,其中包括一个被拒绝承诺的捕获块。请注意,如果doIfNoError也会引发错误,它将被catch捕获。

async function() {
    await Promise.all([some promises])
    .then(doIfNoError) // Promise.all resolved
    .catch(console.log) // Promise.all has at least one rejection
}

promiseAll = async (promises) => {
  await Promise.all(promises)
  .then(doIfNoError) // Promise.all resolved
  .catch(console.log) // Promise.all has at least one rejection
}
    
doIfNoError = () => console.log('No errors');

promiseAll([Promise.resolve(), 1, true, () => (false)]);
promiseAll([Promise.resolve(), 1, true, Promise.reject('rejected: because reasons'), Promise.resolve()]);

相关问题