为何resolve Promise初始状态为pending,reject却直接显示结果?
Promise resolve与reject传入已决议Promise时的状态差异原因
问题描述
当在Promise执行器中调用resolve并传入一个已resolve的Promise时,立即打印该Promise对象,其初始状态为pending(展开控制台下拉项后可看到最终结果,但此处关注初始打印时刻);而调用reject并传入同样的已resolve的Promise时,初始时刻就显示<rejected>状态。请问产生这一差异的原因是什么?
代码示例
示例1:resolve传入已resolve的Promise
const test = new Promise((resolve, reject) => { resolve(Promise.resolve(78)) }) console.log(test); // 控制台输出: Promise {<pending>}
示例2:reject传入已resolve的Promise
const test2 = new Promise((resolve, reject) => { reject(Promise.resolve(78)) }) console.log(test2); // 控制台输出: promise {<rejected>: Promise}
原因解析
这是因为Promise规范对resolve和reject的处理逻辑存在本质区别:
- 调用
resolve(x)时,如果x是一个Promise实例,外层Promise会启动异步解析流程:它会将自身的状态解析逻辑放入微任务队列,等待x的状态确认后再同步自身状态。由于这个过程是异步的,在你立即打印外层Promise时,解析还没开始,所以状态保持pending。 - 而调用
reject(x)时,不管x是什么类型的值(哪怕是已resolve的Promise),外层Promise会同步进入rejected状态,直接把x作为拒绝原因。这里没有异步等待的步骤,所以打印时就能直接看到<rejected>状态。
简单总结:resolve处理Promise类型的参数是异步的,reject则不管参数类型,同步完成状态变更。
内容的提问来源于stack exchange,提问作者lome1446
相关产品推荐
相关产品推荐

