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
相关产品推荐
相关产品推荐

