【问题标题】:Should I use await inside Promise.all?我应该在 Promise.all 中使用 await 吗?
【发布时间】:2021-02-07 09:46:28
【问题描述】:

我正在构建快速中间件以对数据库进行两次异步调用,以检查用户名或电子邮件是否已在使用中。这些函数在没有捕获的情况下返回承诺,因为我想让数据库逻辑与 req/res/next 逻辑分开,并且我有集中式错误处理,需要 next 作为参数。在我对本地环境的邮递员测试中,以下代码按预期工作,我的集中式错误处理程序将错误返回给客户端:

async checkUsernameExists(username) {
    await this.sequelize.transaction(
      async () =>
        await this.User.findOne({
          where: {
            username,
          },
        }).then(user => {
          if (user) throw new Conflict('Failed. Username already in use.');
        }),
    );
  }  

const checkDuplicateUsernameOrEmail = async (
  { body: { email, username } },
  res,
  next,
) => {

  await Promise.all([
    checkUsernameExists(username),
    checkEmailExists(email),
  ])
    .then(() => next())
    .catch(error => next(error));
};

但是,由于checkExists 函数是异步的,它们不应该包含在Promise.all 中并带有await 吗?还是Promise.all 会自动执行此操作?

await Promise.all([
    await checkUsernameExists(username),
    await checkEmailExists(email),
  ])...

这会导致来自 checkUsernameExists 的未处理的 Promise 拒绝,并且没有响应发送回客户端。

【问题讨论】:

    标签: javascript node.js express asynchronous promise


    【解决方案1】:

    我应该在 Promise.all 中使用 await 吗?

    不(至少不是您的做法)。 Promise.all 接受并期望一个 Promises 数组。一旦他们全部解决,或者如果有人拒绝,Promise.all 将解决或拒绝。如果您使用await,您将向Promise.all 传递一个普通的非Promise 值数组,这不是您想要的逻辑。如果您使用await,您还将等待 Promise 串行解决,而不是并行解决,从而破坏Promise.all 的全部观点。例如:

    await Promise.all([
        await checkUsernameExists(username),
        await checkEmailExists(email),
      ])...
    

    如果 checkUsernameExists 需要 0.5 秒来解决,而 checkEmailExists 也需要 0.5 秒来解决,那么 Promise.all 将需要至少 1 秒来解决,因为 Promise 是通过await checkUsernameExistss 解决,而不是通过Promise.all 本身解决。

    你绝对应该这样做

    await Promise.all([
      checkUsernameExists(username),
      checkEmailExists(email),
    ])
    

    异步函数返回 Promises - 到 Promise.allsomeFnThatReturnsAPromise()somePromise 相同。所以调用函数并将生成的 Promise 放入数组中传递给Promise.all 绝对没有错。

    【讨论】:

    • 噢!谢谢,现在看起来很明显。这就是弹出未处理拒绝标志的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    • 2022-12-20
    • 1970-01-01
    • 2021-06-25
    相关资源
    最近更新 更多