Преимущества от асинхронного ожидания по сравнению с обещанием возврата - PullRequest
0 голосов
/ 27 февраля 2019

Я просто пытаюсь понять преимущества этого:

const populateUsers = done => {
  User.remove({}).then(async () => {
    const userOne = new User(users[0]).save();
    const userTwo = new User(users[1]).save();
    const usersProm = await Promise.all([userOne, userTwo]).then(() => done());
    return usersProm;
  });
};

над этим:

const populateUsers = done => {
  User.remove({})
    .then(() => {
      const userOne = new User(users[0]).save();
      const userTwo = new User(users[1]).save();

      return Promise.all([userOne, userTwo]);
    })
    .then(() => done());
};

Я пришел к этой проблеме, потому что Эслинт предложил мне использовать асинхронный в этомфункция, и я помню концепцию, заставить его работать в моем приложении, но я не уверен, почему я должен использовать это вместо оригинального способа

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Ваш оригинальный код был полностью в порядке.

Нет, использование кода из вашего первого фрагмента бесполезно.Вы должны избегать смешивания await и .then(…) синтаксиса !Чтобы использовать async / await, вы должны сделать целую функцию async, а не обратный вызов then:

async function populateUsers(done) {
  await User.remove({})
  const userOne = new User(users[0]).save();
  const userTwo = new User(users[1]).save();

  await Promise.all([userOne, userTwo]);
  return done();
}

(возможно, вы также удалили бы этот обратный вызов done -функция уже возвращает обещание)

0 голосов
/ 27 февраля 2019

Ваша первая версия не проходит до конца .Сделайте это:

const populateUsers = done => {
  User.remove({}).then(async () => {
    const userOne = new User(users[0]).save();
    const userTwo = new User(users[1]).save();
    await Promise.all([userOne, userTwo]);
    const usersProm = await done();
    return usersProm;
  });
};

Нет никакой разницы, просто код без этих обратных вызовов then несколько проще для чтения.

Вы можете даже применить его к внешней функции:

const populateUsers = async () => {
  await User.remove({});
  const userOne = new User(users[0]).save();
  const userTwo = new User(users[1]).save();
  await Promise.all([userOne, userTwo]);
  const usersProm = await done();
  return usersProm;
};

Теперь populateUsers возвращает обещание вместо undefined.

Как указано в комментариях: вы получаете ошибку, потому что populateUsers возвращает обещание и принимает doneАргумент обратного вызова, хотя ожидается один из них, а не оба.

...