new Promise((resolve)=>{resolve()}) 与 Promise.resolve() 等价吗
处理以下类型的时候这个两个方法感觉差不多
参数是一个 Promise 实例
参数是一个thenable对象
参数不是具有then方法的对象,或根本就不是对象
但我看有人说:promise.resolve(v)
不等于new Promise(r => r(v))
,因为如果 v 是一个 Promise 对象,前者会直接返回 v,而后者需要经过一系列的处理(主要是 PromiseResolveThenableJob)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我自己做了一个详细的测试
先说结论:在v是一个promise实例的时候,
promise.resolve(v)
与new Promise(r => r(v))
有明显的差异区别表现:new Promise(r => r(v))的.then()回调会被推迟两个时序(事件循环)
原因:new Promise(r => r(v))里浏览器会创建一个 PromiseResolveThenableJob 去处理这个 Promise 实例,这是一个微任务。具体分析如下
谢邀。
首先是题主说到的第一种情况,即把
Promise
作为构造函数使用,例如new Promise(fn)
,这时候的fn
是同步调用,然后返回一个 promise 的 instance。这部分的说明可见 ECMASCript Spec 里的这部分:然后是题主说到的第二种情况,即把
Promise
作为静态对象,调用Promise.resolve
,这时候还是会返回一个 promise 的 instance。不过如果传入的是非 promise instance,会进行一个包装;而传入的是 promise instance,则不会进行这个额外的包装。这部分的说明可见 ECMAScript Spec 里的这部分:所以回到题主的问题,当 value 是一个 promise instance 的时候,这两种情况确实是不一样的。
实例化promise时,resolve返回的是promise对象时,将会由返回的promise状态决定原实例化promise的状态