【发布时间】:2020-08-28 22:07:14
【问题描述】:
据我所知,异步函数将它们的返回值隐式包装到一个 Promise 中。这对所有属性都有效,除了 Promises 本身。
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(...)))
有没有好的方法来避免这种情况?我真的很想有一个没有像这样的快速修复的嵌套 Promise。
async function y() {
return {wrapped: new Promise((res) => {
setTimeout(() => {
res("Why am I being unwrapped")
}, 1000)
})}
}
(async () => {
console.log((await y()).wrapped)
})()
【问题讨论】:
-
你想要一个在你调用
await时返回一个Promise 的async函数吗?目前尚不清楚混乱是什么。 -
developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - 请注意此部分:
If the return value of an async function is not explicitly a promise, it will be implicitly wrapped in a promise.。所以如果返回值已经是一个promise,它不会被包装。 -
如果你想让一个promise解析为一个promise,那么你必须将内部的promise包装在一个对象中,这样第一个promise就会解析为一个包含promise的对象。无论是
Promise.resolve(somePromise),从.then()处理程序返回一个promise 还是在async函数中返回一个promise,都是如此。它就是这样设计的。 -
有趣的是,为什么?它的设计方式是因为您几乎总是希望 Promise 链接起来,并且让父 Promise 等待子 Promise。没有将父子 Promise 链接在一起的用例是什么?
-
没有。展平适用于每个 thenable(使用
.then方法的对象)。
标签: javascript node.js asynchronous promise async-await