为何Promise的resolve()函数中console.log()会立即执行?
为什么Promise构造函数里的代码会立即执行?
这问题问得好!很多刚接触Promise的同学都会被这个执行顺序搞懵,核心原因其实是Promise构造函数的执行逻辑——听我给你拆解清楚:
首先要记住一个关键规则:当你创建new Promise(executor)时,传入的那个executor函数(就是你写的function(resolve, reject) {...})会被同步调用,不管你有没有给这个Promise绑定.then()或者.catch()回调。这不是bug,是Promise规范特意设计的——目的是让Promise内部的操作(比如发起网络请求、读取文件)能立刻启动,而不是等到你注册回调才开始。
拿你的第一个例子来说,我们一步步梳理执行顺序:
- 调用
sayHello(),函数里立刻执行new Promise(...),这时executor函数直接跑起来,所以先打印Were inside the promise,然后调用resolve(5)——这一步只是把Promise的状态改成fulfilled,把值5存起来,但并不会立刻执行.then()里的回调。 sayHello()返回这个Promise对象,接着你调用.then(),把回调函数注册到Promise的成功回调队列里,但这个回调要等着,不能插队当前的同步代码。- 同步代码继续往下走,打印
Im outside the promise。 - 当所有同步代码都执行完了,JavaScript引擎才会去处理微任务队列——你注册的
.then()回调就在这个队列里,所以这时候才会执行它,打印5。
要是你把executor里的代码改成异步的,比如加个setTimeout,会更清楚这个逻辑:
function sayHello () { return new Promise( function(resolve, reject) { console.log('Were inside the promise'); setTimeout(() => { resolve(5); }, 1000); }) } sayHello().then(function(success){ console.log(success) }) console.log('Im outside the promise')
执行顺序会是:
Were inside the promise Im outside the promise // 等1秒后 5
这里executor里的同步代码还是立刻执行,只是resolve()被放到了宏任务里,得等微任务都处理完,再过1秒才会触发.then()。
最后总结几个核心点:
- Promise的executor函数是同步执行的,创建Promise时就会立刻跑。
.then()/.catch()的回调是异步微任务,必须等当前同步代码执行完毕才会触发。resolve()只是标记Promise状态为成功并保存结果,不会阻塞同步代码,也不会立刻调用回调。
内容的提问来源于stack exchange,提问作者Modermo
相关产品推荐
相关产品推荐

