async函数内部for循环加入await后执行结果异常问题咨询
运行差异的核心原因
这是JavaScript异步事件循环机制 + async/await执行规则共同导致的,核心逻辑如下:
async函数在未遇到await关键字时,内部所有同步代码会按顺序同步执行,直到整个函数运行结束才返回结果- 一旦遇到
await表达式,async函数会立即暂停执行,让出主线程,直到await后的异步任务完成后,才会在后续事件循环调度中恢复剩余代码的执行
两种场景的执行流程拆解
1. 注释await sleep(1)的场景
此时test函数内部没有任何await,两次test调用属于同步执行:
- 先调用
test('a'),同步遍历完整个ids数组,连续输出所有a相关的X、Y日志后函数执行完成 - 再调用
test('b'),同理连续输出所有b相关的X、Y日志
最终输出结果所有a的日志在前,b的日志在后,没有交替。
2. 取消注释await sleep(1)的场景
每次循环都会触发await暂停逻辑,执行流程变为:
- 先调用
test('a'),第一次循环输出X. a a1后遇到await,立即暂停执行,让出主线程,同时注册1ms后触发的定时器任务 - 主线程继续执行后续同步代码
test('b'),第一次循环输出X. b b3后遇到await,也暂停执行,注册第二个定时器任务 - 主线程同步任务全部清空后,等待定时器触发。1ms后定时器回调依次执行,先恢复
test('a')的执行输出Y. a a1,进入第二次循环输出X. a a2后再次遇到await暂停;再恢复test('b')的执行输出Y. b b3,进入第二次循环输出X. b b4后再次暂停 - 下一轮定时器触发后,依次执行剩余逻辑,输出
Y. a a2、Y. b b4
最终日志呈现a、b交替输出的状态。
内容的提问来源于stack exchange,提问作者Tony Dinh
相关产品推荐
相关产品推荐

