Promise链式调用疑问:then回调返回的Promise是否替换then自身返回的Promise?
Promise链式调用核心机制解析
一、then()回调返回Promise时的逻辑
不会直接替换then()自身返回的新Promise,但这个新Promise会「跟随」内部Promise的状态变化:
- 当then的回调返回一个内部Promise(innerPromise),then生成的外部Promise(outerPromise)不会被innerPromise取代,而是进入等待状态;
- 一旦innerPromise成功resolve,outerPromise就会以innerPromise的resolve值完成;
- 如果innerPromise被reject,outerPromise也会以同样的原因被reject。
简单说就是outerPromise把状态委托给了innerPromise,但二者是完全独立的Promise实例。
二、给定代码的Promise链展开结构
先把原代码的链式调用拆成独立Promise实例,一步步梳理:
- 执行
fetch('https://api.example.com/data1'),返回Promise A,负责请求data1接口; - 调用Promise A的
.then()方法,生成Promise B:- 当Promise A成功resolve出
data1后,执行回调:打印Data 1 fetched,然后调用fetch('https://api.example.com/data2')返回Promise C; - Promise B会等待Promise C的状态,当Promise C成功resolve出
data2,Promise B就以data2为值resolve;
- 当Promise A成功resolve出
- 调用Promise B的
.then()方法,生成Promise D:- 当Promise B以
data2resolve后,执行回调:打印Data 2 fetched,尝试返回{ data1, data2 }(注:这里data1在当前回调作用域未定义,会触发运行时错误); - 如果回调返回的是普通值(无错误的情况),Promise D会直接以该值resolve;
- 当Promise B以
fetchData函数最终返回的就是Promise D。
用结构化列表更清晰:
- 初始Promise:
fetch('https://api.example.com/data1')→ Promise A- 调用
.then(data1 => ...)→ 生成Promise B- 回调返回
fetch('https://api.example.com/data2')→ Promise C - Promise B等待Promise C完成,以Promise C的结果作为自身resolve值
- 回调返回
- 调用Promise B的
.then(data2 => ...)→ 生成Promise D- 回调返回(存在作用域问题的)对象
{ data1, data2 },Promise D以该对象(若能正常获取)resolve
- 回调返回(存在作用域问题的)对象
- 调用
fetchData最终返回Promise D
三、补充问题:末尾添加无返回值then()的状态
如果在链的末尾添加如下代码:
.then(() => { console.log("Done"); // 无返回值 })
这个.then()生成的Promise E会以undefined完成解析。原因是:
- then回调如果没有显式返回值,默认返回
undefined; - 新Promise的resolve值完全由回调的返回值决定,和之前链中的
data2或对象无关。只有当回调显式返回某个值(或另一个Promise),新Promise才会对应那个值。
内容的提问来源于stack exchange,提问作者Matt Styles
相关产品推荐
相关产品推荐

