catch 中返回普通值会将 Promise 链恢复为 fulfilled 状态,因其本质是 .then(null, onRejected),onRejected 有返回值时即作为新 Promise 的 fulfillment value。

在 JavaScript 中,catch 回调中返回一个普通值(比如字符串、数字、对象等),会**自动将当前 Promise 链恢复为成功状态(fulfilled)**,后续的 then 会被调用,接收到你返回的值。
为什么能恢复成功状态?
这是因为 catch 本质是 .then(null, onRejected) 的语法糖。当 onRejected 回调执行并**有返回值**(非抛出异常),该返回值会作为新 Promise 的 fulfillment value,即:Promise 状态从 rejected 变为 fulfilled。
关键规则
-
返回任何非 Promise 值(如
"ok"、42、{code: 0})→ 下一个then的第一个参数被调用,接收该值 -
显式返回
Promise.resolve(x)→ 效果同上,但多一层包装,通常不必要 -
不写 return 或返回
undefined→ 下一个then接收undefined(仍是 fulfilled) -
在
catch中再次throw或返回被 reject 的 Promise → 错误继续向下传播,下一个catch会捕获
实际例子
假设请求失败,你想兜底返回默认数据:
fetch('/api/data')
.then(res => res.json())
.catch(err => {
console.warn('请求失败,使用默认数据', err);
return { id: 1, name: 'Guest', role: 'user' }; // ✅ 返回普通对象
})
.then(data => {
console.log('最终数据:', data); // 输出:{ id: 1, name: 'Guest', role: 'user' }
});
注意事项
- 返回值会**被 Promise.resolve() 包装一次**,所以即使你返回一个普通值,它也会变成 fulfilled Promise;这是规范行为,无需手动
Promise.resolve() - 如果想让错误“静默处理”且传递特定结构(如 { success: false, error: … }),直接返回该对象即可,下游可统一判断
- 避免在
catch中忘记 return —— 虽然仍算 fulfilled,但传下去的是undefined,容易引发隐性 bug


















