如何等待承诺?
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
,我做错了什么?
第一版好还是第二版好?
只是让我开始这样。
提前致谢。
您混淆了 callback 和 async/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 快)
我刚开始学习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
,我做错了什么?
第一版好还是第二版好? 只是让我开始这样。
提前致谢。
您混淆了 callback 和 async/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 快)