You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Promise的then()/catch()/finally()返回pending状态的技术问询

未决议Promise:then()初始返回pending状态的Promise

一、then()、catch()、finally()的返回特性

1. then()

立即返回一个新的Promise。无论当前Promise的状态如何,返回时这个新Promise始终处于pending状态。

2. catch()

返回一个新的Promise。无论当前Promise的状态如何,返回时这个新Promise始终处于pending状态。如果onRejected抛出错误或返回一个已拒绝的Promise,它最终会被拒绝;否则,它最终会被兑现。

3. finally()

与catch()类似,finally()会在调用它的对象内部调用then方法。如果onFinally不是函数,则会将onFinally作为两个参数调用then()——对于Promise.prototype.then()来说,这意味着没有附加有效的处理函数。否则,会使用两个内部创建的函数调用then()。

二、关于pending状态的理解

MDN明确指出,then()和catch()返回的Promise初始时始终处于pending状态。

我的理解是:这些方法本身是同步执行的,但它们的回调函数是异步执行的。回调函数是确定返回的Promise会被resolved还是rejected的必要条件,由于回调函数会延后执行,因此这些方法返回的Promise会处于unresolved状态,进而在回调函数执行前始终处于pending状态。

另外,规范中对Promise状态的定义:

如果一个Promise已敲定,或者已“锁定”为匹配另一个Promise的状态,则该Promise是resolved的。尝试决议或拒绝一个已resolved的Promise不会产生任何效果。如果一个Promise不是resolved的,则它是unresolved的。unresolved的Promise始终处于pending状态。resolved的Promise可能处于pending、fulfilled或rejected状态。

三、技术疑问与解答

1. 我对then()、catch()返回pending状态原因的理解是否正确?

你的理解完全正确。then()和catch()被调用时会立即同步返回一个新的pending状态Promise,因为它们接收的回调(onFulfilled/onRejected)要等到当前宏任务执行完毕后,才会进入微任务队列等待执行。而返回的Promise的最终状态完全依赖于这些回调的执行结果——要么回调返回的值会决议这个Promise,要么抛出的错误会拒绝它。在回调执行完成前,这个返回的Promise无法被决议,因此始终处于pending状态。

2. 若该理解正确,finally()是否也遵循同样的逻辑?

是的,finally()遵循完全相同的逻辑。根据定义,finally()本质是通过内部调用then()实现的:如果传入的onFinally是函数,会用两个内部创建的函数调用then();如果不是函数,则直接调用then()并传入该值。既然它基于then()实现,那么自然会和then()一样,立即返回一个pending状态的Promise,直到内部的回调逻辑执行完成后,才会决议这个返回的Promise。

3. catch()、finally()和then()方法本身是否为同步执行?

没错,这三个方法本身都是同步执行的。当你调用promise.then()、promise.catch()或promise.finally()时,这些方法会立即执行并返回新的Promise对象,不会等待任何异步操作完成。真正异步执行的是它们接收的回调函数(onFulfilled、onRejected、onFinally),这些回调会被加入微任务队列,在当前执行栈清空后才会执行。

内容的提问来源于stack exchange,提问作者gus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 14:35:24