如何等待承诺?

How to await a promise?

我刚开始学习NodeJS,在c#知识的推动下,我正在尝试async / await运算符,无论如何,我需要问我如何等待一个承诺来获得结果,特别是:

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

上面的代码使用 user 密码和盐生成 hash。这就像一个魅力,但假设我想打破代码如下:

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

我会得到undefined,我做错了什么?

第一版好还是第二版好? 只是让我开始这样。

提前致谢。

您混淆了 callbackasync/await 这两个不同的工具 用于处理异步调用。


* async/await 模式 *

这里我们调用genSalt()其中returns一个你解析的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);
     });
   });
}


编辑: 回答 "Is the first or second version better?"


Javascript有历史。每年都会制定新版本的 ECMA 规范,如 ECMA2015、ECMA2016、ECMA2017 ...

在 vanilla js 中它们是 回调,在 ES5 中它们是 promises,在 ES6 中它们是 async/await.

async/await是未来。成为未来的一部分!

有必要说明一下:

  • 一个async return一个Promise
  • await 解析 "thenable" 函数,例如 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)
}

我建议您选择一种模式,不要混合在一起,因为这会变得非常难以阅读并影响性能(回调总是比 promise 快)