处理以下类型的时候这个两个方法感觉差不多
参数是一个 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 的时候,这两种情况确实是不一样的。
1 回答851 阅读✓ 已解决
1 回答1.1k 阅读
2 回答773 阅读
2 回答617 阅读
2 回答601 阅读
1 回答680 阅读
2 回答520 阅读
我自己做了一个详细的测试
先说结论:在v是一个promise实例的时候,
promise.resolve(v)与new Promise(r => r(v))有明显的差异区别表现:new Promise(r => r(v))的.then()回调会被推迟两个时序(事件循环)
原因:new Promise(r => r(v))里浏览器会创建一个 PromiseResolveThenableJob 去处理这个 Promise 实例,这是一个微任务。具体分析如下