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,我做错了什么?
第一个或第二个版本更好吗?只是以这种方式开始我。
提前致谢。
您正在混合使用回调和异步/等待这两种用于处理异步调用的工具。
*异步/等待模式*
在这里,我们调用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。
异步/等待是未来。成为未来的一部分!
有必要澄清一下:
async返回一个Promiseawait解析“thenable”函数,例如Promiseawait因此,在回调风格中使用是行不通的。
这是一个混合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)
我建议您选择一种模式,不要混合在一起,因为可能会变得非常难以阅读并影响性能(回调总是比承诺更快)
| 归档时间: |
|
| 查看次数: |
316 次 |
| 最近记录: |