Как сделать функцию обратного вызова в стиле async / await? - PullRequest
0 голосов
/ 29 октября 2018

В настоящее время я работаю с jwt в приложении node.js. Я использую jwt.sign() метод, который выглядит следующим образом:

jwt.sign({
            accountID: user.accountID,
            email: user.email,

        }, process.env.SECRET_KEY, (err, token) => {

            if (err) throw err
            res.json({token})
        })

Я не хочу использовать обратный вызов. Я хочу преобразовать это в async/await. Как я знаю, я должен вернуть new Promise с resole({}) и reject(err). Но я не могу понять, как использовать обещание из метода sign (). Любая помощь приветствуется. Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Если вы используете приведенный выше код в node.js 8, вы можете использовать метод promisify. Проверьте предложение здесь: http://2ality.com/2017/05/util-promisify.html

Для других реализаций рассмотрите возможность использования библиотеки обещаний Bluebird или любой другой подобной библиотеки. Блюберд обещает ссылку: http://bluebirdjs.com/docs/api/promise.promisify.html

0 голосов
/ 29 октября 2018

JavaScript (а также библиотеки, такие как Bluebird) имеет встроенную функцию Promisify как util.promisify(), которая будет принимать функции со стандартным форматом обратного вызова, подобным этому, и превращать их в асинхронные обещания. Однако вы можете взять закулисную работу и запустить ее самостоятельно, включив функцию, которую вы пытаетесь обещать, в новый вызов Promise. В противном случае я бы сделал что-то вроде:

function sign(id, email, secret) {
  return new Promise((resolve, reject) => {
    jwt.sign({ accountID: id, email: email }, secret, (error, token) => {
      if (error) {
        reject(error);
      } else {
        resolve(token);
      }
    });
  });
}

Вы можете затем назвать его как:

const token = await sign(user.accountID, user.email, process.env.SECRET_KEY);
...