[英]JavaScript: Using Async/Await in a Promise
在学习异步 JavaScript 概念的过程中,我对可以链接的情况背后的想法感到困惑。 例如,考虑以下情况:webhook 调用云 function,并且要求设置云 function 响应 webhook 的时间间隔。 在云中 function 被称为从数据库中获取一些数据的操作,它可以是短期或长期运行的任务。 出于这个原因,我们可能希望将 promise 返回到 webhook,只是为了“注册”未来的活动,然后提供结果,例如:
async function main () {
return new Promise ((resolve, reject) => {
try {
db.getSomeData().then(data=> {
resolve({ result: data});
});
} catch (err) {
reject({ error: err.message });
}
});
}
另一种方法是使用async
/ await
而不是 promise 来获取数据,例如:
async function main () {
return new Promise (async (resolve, reject) => {
try {
const data = await db.getSomeData();
resolve({ result: data });
} catch (err) {
reject({ error: err.message });
}
});
}
(代码是一个伪代码,因此对返回类型的所有检查都不被认为是重要的。)
await
是否会阻塞第二个示例中的代码并阻止 promise 的返回?
async
函数总是返回Promise
。 由 function 调用者决定如何处理它:通过使用then/catch
链接或使用await
。 在您的示例中,无需创建并返回新的Promise
。
例如,您可以执行以下操作:
async function main () {
try {
const data = await db.getSomeData()
return {result: data}
} catch (err) {
return {error: err.message}
}
}
// On some other part of the code, you could handle this function
// in one of the following ways:
//
// 1.
// Chaining the Promise with `then/catch`.
main()
.then((result) => console.log(result)) // {result: data}
.catch((err) => console.log(err)) // {error: err.message}
// 2.
// Using await (provided we are working inside an asyn function)
try {
const result = await main()
console.log(result) // {result: data}
} catch (err) {
console.log(err) // {error: err.message}
}
尽量避免将两种处理异步操作的方法结合为最佳实践。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.