JS中Async函数返回的Promise提前触发问题排查
问题分析:为什么"FINISHED"早于"3333"执行?
核心问题出在你的foo2函数上——它没有返回创建的Promise!
让我们一步步拆解执行流程,就能明白为什么会出现这个反直觉的结果:
- 调用
testAsync()后:- 首先执行
await foo1():foo1正确返回了一个Promise,JS会等待这个Promise完成:4秒后输出11111,接着执行foo1内部的then回调输出222222,此时foo1的Promise才会resolve,testAsync继续向下执行。 - 接下来执行
await foo2():这里是关键!foo2内部确实创建了Promise,但没有用return把它返回出去,所以foo2的实际返回值是undefined。而await处理非Promise值时,会自动把它包装成一个立即resolved的Promise,这意味着这一步完全不会等待foo2内部的定时器完成,直接跳到testAsync的剩余逻辑。
- 首先执行
- 由于
testAsync里的两个await都被标记为"完成"(第二个根本没等异步操作),testAsync作为async函数返回的Promise就立即resolve了,于是testAsync().then()里的FINISHED就先被输出了。 - 与此同时,
foo2内部的定时器还在后台默默运行,3秒后才会输出3333。
修复方法
只需要给foo2加上return,让它返回内部创建的Promise即可:
function foo2() { return new Promise(resolve => { // 新增return语句 setTimeout(() => { console.log("3333") resolve() }, 3000) }) }
修改后,await foo2()会正确等待foo2的Promise完成,输出顺序就会变成11111 → 222222 → 3333 → FINISHED,完全符合你的预期。
内容的提问来源于stack exchange,提问作者RicardoAlvveroa
相关产品推荐
相关产品推荐

