如何等待诺言?

时间:2019-03-07 10:25:38

标签: node.js express es6-promise

我刚刚开始学习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 个答案:

答案 0 :(得分:7)

您正在混合使用回调 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 ...

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

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

答案 1 :(得分:1)

有必要进行澄清:

  • 一个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)
}

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