async & await 遇到promise的不同表现

242 阅读1分钟

resolve & Promise.resolve

这是2个不一样的函数。

  • resolve:会调用reoslvePromise
    • 传入 result
      • 微任务 v8处理函数 -> 微任务result.then。(此时通过result来确认promise的状态)
      • 会有2个微任务的等待时间。
  • Promise.resolve:若传入 promise 直接返回传入promise

async

return 时,会调用 resolve

如果return的是 promise会有2个微任务时间(比直接使用promise多一个)

let p1 = Promise.resolve(1)
let async1 = async () => p1
// 相当于 下面这个
let myAsync = () => new Promise(resolve => resolve(p1))

await

await 等于调用 Promise.resolve

V8 源码会直接调用 Promise.resolve。(chrome72版后)

如果 await 的是 promise会有1个微任务时间。

async function fn () {
    // 使用 await
    const res = await value
    console.log(1)
    // 等价于 Promise.resolve
    Promise.resolve(value)
             .then(()=> console.log(1))
}