Promise多then()调用:分支链含义及返回值疑问
关于Promise.then()的两个核心疑问解答
1. 什么是“独立链(separate chains)”?
当你在同一个Promise对象上多次调用then()(而非promise.then().then()这种链式调用),每次调用then()都会开启一条独立的处理链。这些链之间的异步操作互不等待,各自按自身流程执行,不会因某条链的异步延迟而阻塞另一条链。
举个直观示例:
const aPromise = new Promise((resolve) => { resolve('Success!'); }); // 第一条独立链 aPromise.then((value) => { console.log("then()1.1: " + value); // 模拟1秒异步操作 return new Promise(resolve => setTimeout(() => resolve('链1完成'), 1000)); }).then((value) => { console.log("链1后续操作: " + value); }); // 第二条独立链 aPromise.then((value) => { console.log("then()1.2: " + value); // 模拟500毫秒异步操作 return new Promise(resolve => setTimeout(() => resolve('链2完成'), 500)); }).then((value) => { console.log("链2后续操作: " + value); });
执行顺序:
- 先输出
then()1.1: Success!和then()1.2: Success!(按then()添加顺序执行) - 500毫秒后输出
链2后续操作: 链2完成 - 再过500毫秒(总计1秒)输出
链1后续操作: 链1完成
可见第二条链的后续操作不会等待第一条链的异步任务,两条链完全独立运行。
2. 同一个Promise调用两次then()是否返回不同的Promise对象?
是的,每次调用then()都会返回一个全新的Promise对象,它和原Promise、以及其他then()调用返回的Promise都不是同一个引用。
代码验证:
const aPromise = new Promise(resolve => resolve('Success')); const thenPromise1 = aPromise.then(() => {}); const thenPromise2 = aPromise.then(() => {}); console.log(thenPromise1 === thenPromise2); // 输出 false console.log(thenPromise1 === aPromise); // 输出 false
这是then()的核心设计:每次调用都会创建新Promise,用来承接当前回调的返回值(同步值或异步Promise),以此实现链式调用能力。也正是因为每次返回新Promise,才让多条独立链的存在成为可能。
内容的提问来源于stack exchange,提问作者jwa
相关产品推荐
相关产品推荐

