为何JavaScript Promise在初始化阶段就触发输出?
关于JavaScript Promise执行时机的核心疑问
我在深入学习JavaScript Promise时遇到了一个理解上的核心问题:
第一段代码
let p = new Promise(function (resolve, reject) { let a = true if (a) { resolve(console.log("a was true")); } else reject("a was false") })
为何这段代码即使未调用如下的.then()方法,也会立即输出a was true?
p.then((msg) => { return msg })
第二段代码
let p = new Promise(function (resolve, reject) { let a = true if (a) { resolve("a was true") } else reject("a was false") }) p.then((msg) => { console.log(msg) }).catch((msg) => { console.log(msg) })
这段代码仅在调用.then()时才会输出内容。
请指出为何第一段代码无需链式调用.then()就会提前输出?注:我知道这不是异步代码,仅作演示用途。
问题解析
- Promise构造函数的同步执行特性:Promise构造函数接收的执行器(executor)函数是同步执行的——只要创建
new Promise()实例,这个执行器函数就会立刻运行,和后续有没有绑定.then/.catch完全无关。 - 第一段代码的关键问题:你在
resolve()的参数位置直接调用了console.log("a was true")。这相当于先同步执行console.log输出内容,再把console.log的返回值(undefined)传给resolve。整个输出动作发生在Promise实例创建的同步阶段,和.then没有任何关联,所以不管有没有调用.then,都会提前输出。 - 第二段代码的区别:这里
resolve传入的是字符串"a was true",console.log被放到了.then的回调函数里。只有当.then被调用后,对应的回调会作为微任务在同步代码执行完成后触发,此时才会执行console.log输出内容,所以输出动作被推迟到了.then绑定之后。
内容的提问来源于stack exchange,提问作者anshul
相关产品推荐
相关产品推荐

