【问题标题】:Can I await 2 async actions with 1 await?我可以用 1 个等待来等待 2 个异步操作吗?
【发布时间】:2019-03-27 00:14:49
【问题描述】:

我有一个节点模块,它导出一个承诺并解析一个数据库连接。当它解决时,我使用连接来查询记录,这是另一个异步操作。我可以用 1 个 await 执行这两个异步操作吗?

在这种情况下,查询异步调用取决于解析为数据库连接的异步承诺。

模块

module.exports = {
  db: new Promise((acc, rej) => {
      if (!db.authenticated) {
        sequelize.authenticate()
        .then((res) => {
            db.authenticated = true;
            acc(db);
        })
        .catch((err) => {
            rej(err)
        });
      } else {
        acc(db);
      }
  })
};

用法

const db = require('../db/db.js').db;
const existingUser = await db.Person.findOne({where : {email : body.email}});

【问题讨论】:

  • 你能澄清一下这句话吗? query, another async operation, records。不知道你在问什么。
  • 查询是另一个异步操作。
  • 一个动作是否依赖于另一个动作的输出?如果是,那么答案是您不能同时执行这两个操作。
  • 使用await Promise.all([someCall(), anotherCall()]);

标签: javascript node.js async-await


【解决方案1】:

使用await Promise.all([first(), second()]);回复我的评论:

promise.All() 方法将返回一个单独的 Promise,当所有 Promise 作为可迭代对象传递或当可迭代对象不包含任何 Promise 时,该 Promise 最终解决。它将以第一个拒绝的承诺的原因拒绝。

例子

async function one() {
  return new Promise(resolve => {
    resolve('One')
  })
}

async function two() {
  return new Promise(resolve => {
    resolve('Two')
  })
}

async function run() {
  return await Promise.all([one(), two()]); // One await
}

run().then((response) => {
  // Access Individually
  console.log(response[0]); // One
  console.log(response[1]); // Two
  // Access Together
  console.log(response);
})

并回复您最近的评论。如果第二个函数依赖于该参数,则将值从一个 Promise 传递给另一个 Promise。我们可能会做这样的事情。

示例 2

async function first() {
  return new Promise(resolve => {
    resolve('First') // Resolve 'first'
  })
}

async function second(response) {
  return new Promise(resolve => {
    resolve(response); // first() ran, then we appended '& second', then resolve our second response
  })
}

async function run() {
  // Wait for first() response, then call second() with response + append 'second'
  return await first().then((response) => second(response + ' & second'))
}

run().then((response) => {
  // Output: first & second
  console.log(response)
})

文档:promise.All() - MDN

【讨论】:

  • 如果第二个调用依赖于第一个调用的结果怎么办?
  • @Programmatic 好问题,请查看我更新的帖子,并告诉我这是否是您要问的。
  • @Raymond 我有一个问题,正如 TemporaryFix 所说,异步 second() 依赖于 first() 并且所有这两种方法都是异步 HttpClient 调用,我使用了您的解决方案,但它不起作用我的情况。 Here是我的问题,你能看看吗?
  • @KDFinal 第二个例子,如果你注意到first()被调用然后我们调用then(),这意味着second()函数调用取决于第一个。
  • @KDFinal 你还需要那个帖子的帮助吗?
猜你喜欢
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
  • 2016-12-26
  • 1970-01-01
  • 2016-07-07
  • 2016-03-25
  • 2017-10-09
相关资源
最近更新 更多