Можно ли ждать 2 асинхронных действий с 1 ожиданием? - PullRequest
2 голосов
/ 27 марта 2019

У меня есть модуль узла, который экспортирует обещание и разрешает соединение с базой данных.Когда он разрешается, я использую соединение для запроса записей, что является еще одной асинхронной операцией.Могу ли я выполнить оба эти асинхронных действия с 1 ожиданием?

В этом случае запрашивающий асинхронный вызов зависит от асинхронного обещания, разрешающегося в соединение с БД.

Модуль

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

Ответы [ 2 ]

6 голосов
/ 27 марта 2019

В ответ на мой комментарий с использованием 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)
})

Документация: обещание. Все () - MDN

0 голосов
/ 27 марта 2019

В ваших комментариях вы упомянули, что хотите выполнить два асинхронных вызова за другим, используя 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}});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...