我可以等待1等待的2个异步操作吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我可以等待1等待的2个异步操作吗?相关的知识,希望对你有一定的参考价值。

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

在这种情况下,查询异步调用依赖于解析为db连接的异步promise。

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}});
答案

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

promise.All()方法将返回单个promise,当所有promises作为iterable传递或者iterable不包含任何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);
})
另一答案

在您的评论中,您提到要使用await在另一个之后运行两个异步调用。

另一个答案使用了promises来向你展示这种行为。如何使用等待你可以非常干净地运行两个异步调用!做就是了:

async twoAsyncCalls(){

    let firstResult = await first();
    //Things to do after first

    let secondResult = await second();
   //Things to do after second

    //To catch any async errors surround this code with a try catch block!

    return {/* return anything here*/}
    //This will be wrapped in a promise

}

所以要回答你的问题,你不能只使用一个等待顺序运行2个异步调用!你需要2个await语句。

您的代码应更改为此用法

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

以上是关于我可以等待1等待的2个异步操作吗?的主要内容,如果未能解决你的问题,请参考以下文章

js Promise 等待多个异步操作执行完再去做一些操作

关于其活动的片段生命周期

我可以让 Fragment 等待来自 Activity 的数据吗?

可以使用 Task.WhenAll(...) 或其他比每次等待更有意义的东西重写此异步/等待代码吗? [复制]

MVVM 异步等待模式

在一些 .NET Parallel.ForEach() 代码中做一些异步/等待可以吗?