Promise链中then/finally/catch返回的Promise是同步还是异步创建?
Promise链中后续Promise的创建时机
结论很明确:Promise链中通过then()/finally()/catch()生成的新Promise(比如你示例里的promise2、promise3、promise4),会在调用这些方法时同步创建,完全不需要等到对应的回调函数执行。
具体解释
当你调用promise1.finally()时,不管promise1当前是resolved、rejected还是pending状态,这个方法会立刻返回一个新的Promise实例(即promise2),同时把你传入的回调函数注册到promise1的回调执行队列中。
同理,紧接着调用promise2.then()时,会立刻创建promise3;调用promise3.catch()时,会立刻创建promise4。这些新Promise的初始状态都是pending,它们的最终状态会依赖于前一个Promise的状态,以及对应回调函数的执行结果,但它们的创建过程是同步完成的,和回调是否执行没有关系。
代码验证
你可以给示例代码添加同步日志,直观看到创建时机:
let promise1 = Promise.resolve('Stackoverflow'); console.log('创建promise1后'); const promise2 = promise1.finally(() => { console.log('finally()回调执行'); }); console.log('promise2已创建:', promise2); const promise3 = promise2.then((data) => { console.log('Data: ' + data); }); console.log('promise3已创建:', promise3); const promise4 = promise3.catch((rejection) => { console.log('rejection: ' + rejection); }); console.log('promise4已创建:', promise4);
运行后日志顺序如下:
创建promise1后 promise2已创建: Promise { <pending> } promise3已创建: Promise { <pending> } promise4已创建: Promise { <pending> } finally()回调执行 Data: Stackoverflow
从日志能清晰看到:promise2、3、4在finally()和then()的回调执行前就已经存在,只是初始状态为pending。
内容的提问来源于stack exchange,提问作者gus
相关产品推荐
相关产品推荐

