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

时间:2019-03-27 00:14:50

标签: javascript node.js async-await

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

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

模块

buildToolsVersion

用法

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

2 个答案:

答案 0 :(得分:6)

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

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

  

示例

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

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

  

示例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

答案 1 :(得分:-1)

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

另一个答案使用了承诺来向您展示这种行为。如何使用await可以很干净地运行两个异步调用!只是做:

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条等待语句。

您的代码应更改为此用法

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