You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Promise的resolve()函数中console.log()会立即执行?

为什么Promise构造函数里的代码会立即执行?

这问题问得好!很多刚接触Promise的同学都会被这个执行顺序搞懵,核心原因其实是Promise构造函数的执行逻辑——听我给你拆解清楚:

首先要记住一个关键规则:当你创建new Promise(executor)时,传入的那个executor函数(就是你写的function(resolve, reject) {...})会被同步调用,不管你有没有给这个Promise绑定.then()或者.catch()回调。这不是bug,是Promise规范特意设计的——目的是让Promise内部的操作(比如发起网络请求、读取文件)能立刻启动,而不是等到你注册回调才开始。

拿你的第一个例子来说,我们一步步梳理执行顺序:

  1. 调用sayHello(),函数里立刻执行new Promise(...),这时executor函数直接跑起来,所以先打印Were inside the promise,然后调用resolve(5)——这一步只是把Promise的状态改成fulfilled,把值5存起来,但并不会立刻执行.then()里的回调。
  2. sayHello()返回这个Promise对象,接着你调用.then(),把回调函数注册到Promise的成功回调队列里,但这个回调要等着,不能插队当前的同步代码。
  3. 同步代码继续往下走,打印Im outside the promise。
  4. 当所有同步代码都执行完了,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:57:32