为何Promise的finally块返回Promise无法传递值,需后续then处理?
Promise的finally()为啥不能传递新值?
这事儿的核心在于finally()的设计定位:它就是个不管Promise成功失败都要执行的“清理环节”,根本不负责修改或者传递新的Promise值。
关键特性说明
当你在finally()里返回一个Promise时,它只会等待这个Promise执行完成,但绝对不会把这个Promise的结果替换掉原链里要传递的值。原链该传啥还是传啥,finally返回的Promise结果直接被忽略。
失败示例拆解
看这段失败代码:
function res(v) { return new Promise((resolve, reject) => { resolve(v); }) } function rej(v) { return new Promise((resolve, reject) => { reject(v); }) } rej(1) .then((val) => { console.log(`Value1: ${val}`); }) .catch((e) => { console.error(`Caught 1: ${e}`); // catch里没显式return,默认返回undefined,这就是原链要传递的值 }) .finally(() => { console.log("Finally 1"); return res(2); // 这里返回的res(2)结果直接被无视 }) .then((v) => { console.log(`Value2: ${v}`); // 自然拿到的是catch传递的undefined }) .catch((e) => { console.log(`Caught 2: ${e}`); }) .finally(() => { console.log("Finally 2"); });
成功示例为啥能行?
再看这段成功的代码:
function res(v) { return new Promise((resolve, reject) => { resolve(v); }) } function rej(v) { return new Promise((resolve, reject) => { reject(v); }) } rej(1) .then((val) => { console.log(`Value1: ${val}`); }) .catch((e) => { console.error(`Caught 1: ${e}`); // 同样返回undefined }) .finally(() => { console.log("Finally 1"); }) .then(() => { return res(2); // 这里是在then()里返回新Promise,链的传递值会替换成res(2)的结果 }) .then((v) => { console.log(`Value2: ${v}`); // 所以能拿到正确的2 }) .catch((e) => { console.log(`Caught 2: ${e}`); }) .finally(() => { console.log("Finally 2"); });
补充两个finally的核心细节
- finally的回调不接收任何参数,因为它不需要关心原Promise的状态或值,只负责执行固定的清理逻辑
- 如果finally里返回的Promise是rejected状态,整个链会切换为失败状态并传递这个reject值——这是唯一能影响链状态的情况,但成功值依然会被忽略
说白了,finally就是个“干完自己的活就交棒,绝不插手前面传下来的值”的角色,要传递新值,就得用then()来实现。
内容的提问来源于stack exchange,提问作者Ryan Griggs
相关产品推荐
相关产品推荐

