关于变量存储Promise的同步执行及链式调用的困惑咨询
搞懂这段Promise链式调用的执行逻辑
嘿,我来帮你把这段代码的执行流程拆解得明明白白,再也不困惑~
首先先把你的完整代码贴出来,方便我们一步步分析:
const promise1 = new Promise((resolve, reject) => { setTimeout(() => { resolve('promise 1'); }, 1000); }); const promise2 = new Promise((resolve, reject) => { setTimeout(() => { resolve('promise 2'); }, 1000); }); promise1 .then(data => { console.log(data); return promise2; }) // 假设你后续还有这个回调逻辑 .then(data => { console.log(data); });
第一步:Promise构造函数的同步执行
当你定义promise1和promise2的瞬间,这两个Promise的构造函数就立刻同步执行了——也就是说,里面的setTimeout会被马上添加到浏览器的定时器队列中,两个定时器都被设定为1000毫秒后触发。此时两个Promise的状态都是pending(等待中)。
第二步:1000毫秒后的宏任务触发
1秒后,两个定时器的回调函数(也就是各自的resolve)会被依次加入到宏任务队列中等待执行:
- 先处理
promise1的resolve('promise 1'):这会把promise1的状态从pending改成resolved,并且把你注册在promise1.then()里的回调函数,添加到微任务队列中。 - 接着处理
promise2的resolve('promise 2'):同样把promise2的状态改成resolved,不过这时候还没有任何回调监听它的状态变化,所以暂时没别的动作。
第三步:微任务队列的执行
当当前的宏任务(也就是两个定时器回调)执行完后,事件循环会开始处理微任务队列:
- 执行
promise1.then()里的回调:先打印出promise 1,然后返回promise2。 - 这里的核心知识点:
then方法会返回一个全新的Promise。当你在then的回调里返回另一个Promise(也就是promise2)时,这个新Promise会自动等待promise2的状态变化——但此时promise2已经是resolved状态了,所以紧接着,下一个then的回调会被立刻加入微任务队列。 - 执行下一个
then的回调,打印出promise 2。
额外小测试(加深理解)
如果把promise2的定时器改成2000毫秒,也就是:
const promise2 = new Promise((resolve, reject) => { setTimeout(() => { resolve('promise 2'); }, 2000); });
那执行顺序会变成:
- 1秒后打印
promise 1,然后返回promise2,此时promise2还是pending状态。 - 再等1秒,
promise2的resolve触发,状态变成resolved,才会触发下一个then的回调,打印promise 2。
关键总结
- Promise构造函数是同步执行的,里面的异步操作会立刻启动。
then方法返回新的Promise,当返回另一个Promise时,新Promise会“继承”它的状态和结果。- 事件循环的顺序:先处理完所有宏任务,再处理微任务;定时器回调属于宏任务,
then的回调属于微任务。
内容的提问来源于stack exchange,提问作者Natalia Ivanova
相关产品推荐
相关产品推荐

