嵌套Promise返回意外输出:为何我的Promise状态为fulfilled?
为何我的Promise状态最终是fulfilled?
我明确Promise处理函数返回不同结果时的状态和结果规则:
- 返回值:Promise以该值fulfilled
- 无返回:Promise以undefined fulfilled
- 抛出错误:Promise以该错误rejected
- 返回已fulfilled的Promise:Promise以其值fulfilled
- 返回已rejected的Promise:Promise以其值rejected
- 返回pending的Promise:Promise处于pending,待其状态变更后同步变更
但运行以下代码后,test2的状态却是fulfilled,这是为什么?
const test = Promise.reject(new Promise((resolve, reject) => { throw new Error("error") })) const test2 = test.catch((result) => { result.catch(() => { throw new Error("error2"); }) }) console.log(test2);
控制台输出:
[[Prototype]]: Promise [[PromiseState]]: "fulfilled" [[PromiseResult]]: undefined
问题分析
核心原因是外层catch回调没有返回值,触发了你列出的规则第2条:无返回的Promise处理函数会让Promise以undefined fulfilled。
具体拆解:
test是一个被reject的Promise,它的reject值是另一个Promise(记为innerPromise)。innerPromise的执行器里直接抛出错误,所以它本身会被reject,原因是Error("error")。- 当
test.catch执行时,参数result就是这个innerPromise。你在回调里调用了result.catch(...),但没有把这个catch返回的Promise作为外层回调的返回值。 - 外层
catch回调执行完后没有return任何内容,所以test2直接遵循规则,以undefined完成fulfilled状态。 - 你在
result.catch里抛出的Error("error2")只会影响那个内层catch返回的Promise,和test2无关——因为你没把这个内层Promise返回给外层,test2不会等待它的状态变化,直接就完成了。
修正方案
如果想让test2因为error2变成rejected,只需把内层catch返回的Promise作为外层回调的返回值即可:
const test2 = test.catch((result) => { return result.catch(() => { throw new Error("error2"); }) })
这样外层catch返回了一个Promise,当内层catch抛出错误时,这个返回的Promise会被reject,test2的状态就会同步变成rejected,结果为Error("error2")。
内容的提问来源于stack exchange,提问作者lome1446
相关产品推荐
相关产品推荐

