如何等待诺言?

ter*_*res 2 node.js express es6-promise

我刚刚开始学习NodeJS,并c#在尝试async / await操作员的知识的推动下,无论如何,我需要问我如何等待获得结果的承诺,特别是:

const salt = await bcrypt.genSalt(10);
const hash = await bcrypt.hash(user.password, salt);
Run Code Online (Sandbox Code Playgroud)

上面的代码hash使用user密码和盐生成一个。这就像一种魅力,但是假设我要按以下方式破坏代码:

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

我会明白undefined,我做错了什么?

第一个或第二个版本更好吗?只是以这种方式开始我。

提前致谢。

Gré*_*EUT 7

您正在混合使用回调异步/等待这两种用于处理异步调用的工具。


*异步/等待模式*

在这里,我们调用genSalt(),它返回您要解析的Promise对象(等待操作完成)

const hash = await bcrypt.genSalt(10);
Run Code Online (Sandbox Code Playgroud)

*回调模式*

在这里,我们正在调用genSalt()它将在完成时调用提供的函数作为回调。

bcrypt.genSalt(10, () => {
   // Callback
});
Run Code Online (Sandbox Code Playgroud)

这些是处理异步功能的两种不同方法。



因此,以下示例正在工作:

// async/await pattern
const salt = await bcrypt.genSalt(10);
const hash = await bcrypt.hash(user.password, salt);
Run Code Online (Sandbox Code Playgroud)
// callback pattern
function generate(callback) {
   bcrypt.genSalt(10, (salt) => {
     bcrypt.hash(user.password, salt, (hash) => {
        callback(hash);
     });
   });
}
Run Code Online (Sandbox Code Playgroud)

编辑:要回答“第一个或第二个版本更好吗?”


Javascript有历史。每年都会制作新版ECMA规范,例如ECMA2015,ECMA2016,ECMA2017 ...

在普通js中,它们是回调,在ES5中,它们是promises,在ES6中,它们是async / await

异步/等待是未来。成为未来的一部分!


Man*_*lon 6

有必要澄清一下:

  • 一个async返回一个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)
}
Run Code Online (Sandbox Code Playgroud)

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