最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

JS:异步函数隐式解包了诺言?

IT培训 admin 15浏览 0评论

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:异步函数隐式解包了诺言?

据我所知,异步函数将其返回值隐式包装为一个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()) })()

发布评论

评论列表 (0)

  1. 暂无评论