Как ждать обещание? - PullRequest
       16

Как ждать обещание?

2 голосов
/ 07 марта 2019

Я только начал изучать NodeJS и получил c# знания. Я пытаюсь использовать оператор async / await, в любом случае, мне нужно спросить, как я могу ждать обещание получить результат, в частности:

const salt = await bcrypt.genSalt(10);
const hash = await bcrypt.hash(user.password, salt);

Приведенный выше код генерирует hash с использованием пароля user и соли.Это работает как талисман, но предположим, что я хочу разбить код следующим образом:

 const hash = await bcrypt.genSalt(10, async (err, salt) =>  {
        return await bcrypt.hash(user.password, salt);
 });

Я получу undefined, что я сделал не так?

Первый или второйверсия лучше?Просто чтобы начать меня с этого пути.

Заранее спасибо.

Ответы [ 2 ]

7 голосов
/ 07 марта 2019

Вы смешиваете обратный вызов и async / await , которые являются двумя различными инструментами используется для работы с асинхронными вызовами.


* асинхронная / ожидающая схема *

Здесь мы вызываем genSalt(), который возвращает разрешенный вами объект Promise (дождитесь завершения операции) .

const hash = await bcrypt.genSalt(10);

* шаблон обратного вызова *

Здесь мы вызываем genSalt(), который по завершении вызовет предоставленную функцию как обратный вызов.

bcrypt.genSalt(10, () => {
   // Callback
});

Тезисы представляют собой два различных метода для обработки асинхронных функций.



Так работает следующий пример:

// async/await pattern
const salt = await bcrypt.genSalt(10);
const hash = await bcrypt.hash(user.password, salt);

// callback pattern
function generate(callback) {
   bcrypt.genSalt(10, (salt) => {
     bcrypt.hash(user.password, salt, (hash) => {
        callback(hash);
     });
   });
}


РЕДАКТИРОВАТЬ: Чтобы ответить «Первая или вторая версия лучше?»


У Javascript есть история. Каждый год составляется новая версия стандарта ECMA, например ECMA2015, ECMA2016, ECMA2017 ...

В vanilla js они были обратными вызовами , в ES5 они были обещаниями , в ES6 они были асинхронными / ожидающими .

async / await - будущее. Будь частью будущего!

1 голос
/ 07 марта 2019

Необходимо уточнение:

  • и async возвращают Promise
  • await разрешают "тогда доступные" функции, такие как Promise

Итак, использование await в стиле обратного вызова не работает.

Это пример с вашим перепутанным callback + async/await, чтобы лучше понять, какони работают.

function getMyHash(password) {
  return new Promise((resolve, reject) => {
    bcrypt.genSalt(10, async (err, salt) => {
      if (err) {
        reject(err)
        return
      }
      try {
        const hash = await bcrypt.hash(password, salt);
        resolve(hash)
      } catch (err) {
        reject(err)
      }
    });
  })
}

function async doSomething() {
  const hash = await getMyHash(user.password)
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...