我刚刚开始学习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
,我做错了吗?
第一个或第二个版本更好吗? 只是以此方式开始我。
谢谢。
答案 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)
}
我建议您选择一种模式,不要混淆在一起,因为这可能会变得很难阅读并影响性能(回调总是比承诺快得多)