JavaScript中Promise与setTimeout协同工作及代码执行顺序疑问
Promise执行流程拆解与问题解释
先直接点出核心问题:你代码里的func().then(console.log("abc"))是错误写法,导致"abc"被同步打印,而非等待func()执行完成后触发。
代码执行全步骤拆解:
1. 同步执行阶段(代码从上到下立即执行的部分)
- 定义
wait函数,仅完成声明,不执行函数体。 - 执行
let a = true,同步完成变量赋值。 - 创建Promise实例
p:
Promise构造函数的executor函数(你写的async函数)会立即执行:- 调用
wait(3000),创建新Promise,内部的setTimeout将回调加入宏任务队列(等待3秒后执行)。 - 遇到
await wait(3000),await会暂停当前async函数(即p的executor)的执行,此时Promisep处于pending状态。
- 调用
- 定义
func异步函数,仅完成声明,不执行函数体。 - 执行
func().then(console.log("abc")):- 先调用
func():进入func函数,遇到await p,因p处于pending状态,func暂停执行,返回一个pending状态的Promise。 - 随后执行
console.log("abc"):这里你是直接调用console.log,而非把它作为回调函数传给then!所以这是同步代码,立即打印"abc",之后把console.log的返回值(undefined)传给then,相当于then(undefined),后续不会触发任何回调。
- 先调用
2. 异步执行阶段(宏任务队列开始处理)
- 3秒后,
setTimeout的回调触发:- 打印"Done waiting",随后resolve
wait返回的Promise。
- 打印"Done waiting",随后resolve
- 此时,p的executor函数(之前被await暂停的async函数)恢复执行:
- 打印"Inside Promise",因
a=true,调用resolve("Success"),Promisep变为fulfilled状态。
- 打印"Inside Promise",因
p变为fulfilled后,func里的await p恢复执行:- 拿到"Success"并打印,
func返回的Promise也变为fulfilled状态。
- 拿到"Success"并打印,
- 但由于之前
then传入的是undefined,没有后续回调执行。
修正写法
如果想让"abc"在func()执行完成后打印,需要把console.log包装成回调函数传给then:
func().then(() => console.log("abc"));
修改后执行顺序会变为:
Done waiting Inside Promise Success abc
内容的提问来源于stack exchange,提问作者RichS
相关产品推荐
相关产品推荐

