包了诺言?"/>
JS:异步函数隐式解包了诺言?
据我所知,异步函数将其返回值隐式包装为一个Promise。这对每个财产都适用,但承诺自己除外。
async function f() {
return new Promise((res) => {
setTimeout(() => {
res("Why am I being unwrapped")
}, 1000)
})
}
(async () => {
console.log(await f())
})()
那些在退货前先被解开。这样await f()
实际上会等待两个嵌套的Promise。
请注意,这也适用于显式创建的Promises(
Promise.resolve(new Promise(...))
)
是否有good方式可以避免这种情况?我真的很想在没有类似Quickfix的情况下嵌套Promise。
async function y() {
return {wrapped: new Promise((res) => {
setTimeout(() => {
res("Why am I being unwrapped")
}, 1000)
})}
}
(async () => {
console.log((await y()).wrapped)
})()
Sandbox
回答如下:根据MDN documentation on async
functions:
异步函数总是返回承诺。如果异步函数的返回值不是显式的promise,则将其隐式包装在promise中。
换句话说,由于您返回的是Promise,因此不会被包装。如果您想重新包装它,可以,但是您也可以去除具有类似效果的async
关键字。您将原始的Promise退还[[除非您async
。
await
哪个会给您输出像:
function f() { return new Promise((res) => { setTimeout(() => { res("Might be wrappers on some of you, but not on me!") }, 1000) }) } (async () => { console.log(f()) })()
更多推荐
JS:异步函数隐式解包了诺言?
发布评论