promise链条中用return控制then输入、throw/promise.reject触发catch、promise.all/race协调多任务、finally做清理不改流程。

在 Promise 链条中控制执行流程,核心在于理解 then、catch、finally 的返回值如何影响后续步骤,以及如何用 return、throw、Promise.resolve 或 Promise.reject 主动干预链路走向。
用 return 控制下一级 then 的输入
then 回调里 return 什么,下一个 then 就会接收到什么:
- 返回普通值(如字符串、数字、对象)→ 下一个
then收到该值(自动包装成 resolved Promise) - 返回另一个 Promise → 下一个
then等它 settle 后,接收其结果(resolved 值或 rejected 原因) - 不写
return或返回undefined→ 下一个then收到undefined
示例:
fetch('/api/user').then(res => res.json())
.then(user => {
console.log('用户信息:', user);
return user.id; // 下个 then 收到的是 id
})
.then(id => fetch(`/api/posts?userId=${id}`))
.then(res => res.json())
.then(posts => console.log('文章列表:', posts));
用 throw 或 Promise.reject 中断并跳转到 catch
只要在任意 then 或 catch 中抛出错误(throw)或返回被 reject 的 Promise,链条就会跳过后续的 then,直接进入最近的 catch:
-
throw new Error('xxx')→ 触发 reject,进入catch -
return Promise.reject(new Error('xxx'))→ 效果同上 -
catch中不重新抛出错误 → 链条恢复为 resolved,后续then仍可执行
示例(条件性中断):
.then(res => {
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.json();
})
.then(data => {
if (!data.items?.length) throw new Error('数据为空');
return data.items;
})
.catch(err => console.error('出错了:', err.message));
用 Promise.all / Promise.race 协调多个异步任务
当需要并行发起多个请求,并统一控制后续流程时,可在链条中插入聚合操作:
-
Promise.all([p1, p2, p3])→ 全部成功才继续,任一失败则整体 reject -
Promise.race([p1, p2, p3])→ 谁先 settle 就用谁的结果/错误 - 它们本身是 Promise,可自然融入链条,
then接收聚合后的结果数组或单个值
示例:
fetch('/api/config').then(res => res.json())
.then(config => Promise.all([
fetch(config.apiA).then(r => r.json()),
fetch(config.apiB).then(r => r.json())
]))
.then(([dataA, dataB]) => {
console.log('两个接口都完成了', dataA, dataB);
})
.catch(err => console.error('任一请求失败', err));
用 finally 做清理,但不改变流程走向
finally 适合放 loading 关闭、资源释放等“无论成功失败都要做的事”,但它不接收前序结果,也不影响后续状态:
- 它内部不能通过
return改变链路 resolve/reject 状态 - 它内部
throw会覆盖前序成功结果,变成 reject;若前序已是 reject,则新错误会取代原错误 - 通常只做副作用,不做逻辑分支判断
示例:
showLoading();fetch('/api/data')
.then(res => res.json())
.then(data => processData(data))
.catch(err => handleError(err))
.finally(() => hideLoading()); // 总是执行
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











