You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Async/Await执行顺序疑问:未执行return为何先返回pending状态Promise

你对执行顺序的现有理解是正确的,只要拆解async函数的底层执行逻辑就能解开你的疑惑:

async函数执行流程

  • 调用async函数的第一时间,JS引擎会先在内部创建一个处于Pending状态的全新Promise实例,这个实例就是最终会返回给调用方的对象,和函数后续是否执行return语句没有关系,初始化Promise是async函数调用后触发的第一个内置动作。
  • 接下来引擎会同步执行async函数内部的代码,直到遇到第一个await关键字才会暂停:在你的示例中,fetch(albumUrl + '/' +id)会同步执行、立刻发起网络请求并返回对应Promise,这时候才命中await关键字。
  • 碰到await后,引擎会立刻中断当前async函数的执行,把最开始创建的Pending状态Promise直接返回给调用方,所以你后面的console.log('Promise 1', alb)会先执行,这就是Promise日志最先打印的原因。
  • 等到await后面的整个fetch Promise链决议完成后,JS会把决议结果赋值给album变量,恢复async函数的执行,继续往下打印Concrete Value 1,再执行return album语句,这一步会把之前返回的Pending Promise的状态改为fulfilled,值设置为你return的album对象。
  • 这个Promise的状态变更会触发后续绑定的then回调,最终打印Concrete Value 2。

你可以用一个简单的类比理解:调用async函数就像去奶茶店点单,店员第一步先给你取餐号(就是提前返回的Pending Promise),之后才开始制作饮品(对应await后的异步逻辑),你拿到号之后可以先做别的事(对应调用async函数后的同步代码),等饮品制作完成(await的异步逻辑执行完毕),才会通知你取餐(对应恢复async函数执行、触发then回调)。

内容的提问来源于stack exchange,提问作者user1175801

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 20:54:03