处理以下类型的时候这个两个方法感觉差不多
参数是一个 Promise 实例
参数是一个thenable对象
参数不是具有then方法的对象,或根本就不是对象
但我看有人说:promise.resolve(v)
不等于new Promise(r => r(v))
,因为如果 v 是一个 Promise 对象,前者会直接返回 v,而后者需要经过一系列的处理(主要是 PromiseResolveThenableJob)
参数是一个 Promise 实例
参数是一个thenable对象
参数不是具有then方法的对象,或根本就不是对象
但我看有人说:promise.resolve(v)
不等于new Promise(r => r(v))
,因为如果 v 是一个 Promise 对象,前者会直接返回 v,而后者需要经过一系列的处理(主要是 PromiseResolveThenableJob)
谢邀。
首先是题主说到的第一种情况,即把 Promise
作为构造函数使用,例如 new Promise(fn)
,这时候的 fn
是同步调用,然后返回一个 promise 的 instance。这部分的说明可见 ECMASCript Spec 里的这部分:
The Promise constructor is the %Promise% intrinsic object and the initial value of the Promise
property of the global object. When called as a constructor it creates and initializes a new Promise object.
然后是题主说到的第二种情况,即把 Promise
作为静态对象,调用 Promise.resolve
,这时候还是会返回一个 promise 的 instance。不过如果传入的是非 promise instance,会进行一个包装;而传入的是 promise instance,则不会进行这个额外的包装。这部分的说明可见 ECMAScript Spec 里的这部分:
The resolve
function returns either a new promise resolved with the passed argument, or the argument itself if the argument is a promise produced by this constructor.
所以回到题主的问题,当 value 是一个 promise instance 的时候,这两种情况确实是不一样的。
8 回答4.6k 阅读✓ 已解决
6 回答3.3k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
5 回答6.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
4 回答2.7k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
我自己做了一个详细的测试
先说结论:在v是一个promise实例的时候,
promise.resolve(v)
与new Promise(r => r(v))
有明显的差异区别表现:new Promise(r => r(v))的.then()回调会被推迟两个时序(事件循环)
原因:new Promise(r => r(v))里浏览器会创建一个 PromiseResolveThenableJob 去处理这个 Promise 实例,这是一个微任务。具体分析如下