为什么new Promise传入的回调函数会立即执行?
问题核心误区
你混淆了Promise构造函数入参和Promise回调的执行规则:传入new Promise()的函数(叫executor执行器)是同步立即执行的,根本不会进入微任务队列,只有.then/.catch/.finally注册的回调才会被放进微任务队列等待调度。
具体执行规则
当你调用new Promise()创建实例时,JS引擎会在当前执行上下文同步完成两个操作:
- 生成一个初始状态为pending的Promise实例对象
- 直接同步调用你传入的executor函数,同时把内部实现的
resolve、reject两个状态变更方法作为参数传入executor,这一步不会做任何异步等待。
只有当你调用resolve()/reject()把Promise状态变更后,通过.then/.catch/.finally注册的响应回调,才会被送入微任务队列,等当前调用栈所有同步代码执行完毕后,再按入队顺序依次执行。
对应示例代码的执行流程
你给出的示例代码:
const prom = new Promise((resolve, reject) => { console.log("in Promise"); resolve(20); }); prom.then((data) => { console.log(12312323); console.log(data); }); console.log(77);
实际执行顺序和输出完全符合规则:
- 执行
new Promise()逻辑,同步调用executor:- 运行
console.log("in Promise"),输出第一行内容in Promise - 运行
resolve(20),将prom的状态从pending变更为fulfilled,绑定结果值为20
- 运行
- 执行
prom.then(...):因为Promise已经是敲定状态,传入的回调被送入微任务队列排队,暂不执行 - 运行全局最后一行同步代码
console.log(77),输出第二行内容77 - 全局同步代码执行完毕,调用栈清空,开始清空微任务队列
- 取出队列中排队的then回调执行:
- 运行
console.log(12312323),输出第三行对应内容 - 运行
console.log(data),拿到resolve传入的20,输出第四行内容20
- 运行
快速记忆规则:写在
new Promise((resolve,reject) => { 这个大括号范围内的代码 }),执行时机和普通同步函数没有区别;只有写在then/catch/finally回调里的代码,才是异步微任务逻辑。
内容的提问来源于stack exchange,提问作者user19358601
相关产品推荐
相关产品推荐

