当前位置: 首页 > Web前端 > HTML

Promise.resolve()和newPromise(resolve=-resolve())的区别

时间:2023-03-28 15:20:30 HTML

参考:Promise.resolve()是否等同于newPromise(r=>r(v))newPromise((resolve)=>{resolve()})和Promise.resolve()?讨论:当Async/Await遇到EventLoop的返回值时,如果参数是promise实例,前者返回新合约,后者原样返回:letp=newPromise((r)=>{r("123")})//Promise.resolve会保持不变返回这个实例p===Promise.resolve(p)//true//newPromise()返回一个新的promiseletp2=newPromise((r)=>{r(p)})p2!==p//真正的参数是一个thenable对象,两者都返回一个新的解析契约:letthenable={then:function(resolve,reject){resolve("123")}}letp1=newPromise((r)=>{//p1:Promise{:"123"}r(thenable)})letp2=Promise.resolve(thenable)//p2:Promise{:"123"}thenexecutiontimingnewPromise(then()callbackofr=>r(v))会延迟两个时间(事件循环):console.log("scriptstart")letv=newPromise((resolve)=>{console.log("vstart")resolve("vresolve")})letp1=newPromise((resolve)=>{console.log(1)解决(v)})。然后((v)=>{console.log(v)})newPromise((resolve)=>{resolve()}).then(()=>{console.log(2)}).then(()=>{console.log(3)}).then(()=>{console.log(4)}).then(()=>{console.log(5)})console.log("scriptend")//"scriptstart"//"vstart"//1//"scriptend"//2//3//vresolve推迟两个循环//4//5和Promise.resolve(v)andthen()都正常:console.log("scriptstart")letv=newPromise((resolve)=>{console.log("vstart")resolve("vresolve")})Promise.resolve(v).then((v)=>{console.log(v)})newPromise((resolve)=>{resolve()}).then(()=>{console.log(2)}).then(()=>{console.log(3)}).then(()=>{console.log(4)}).then(()=>{console.log(5)})console.log("scriptend")//"scriptstart"//"vstart"//"scriptend"//"vresolve"//2//3//4//5原因:这是因为当浏览器发现resolve是另一个promise(假设原来的promise叫promiseA,另一个promise叫promiseB),会创建一个名为PromiseResolveThenableJob的任务来处理promiseB,这个任务是一个微任务promiseBresolve后,会生成一个microtask来处理promiseA(resolvePromiseA)。resolvePromiseA微任务执行完后,promiseA的then会被执行,所以两个事件循环被推迟,Promise.resolve()的then正常执行。因为当参数为promiseB时,不做任何处理,直接返回promiseB本身。可以使用伪代码将PromiseResolveThenableJob表达为:letpromiseA=newPromise((resolve)=>{resolve(promiseB)}).then(()=>{console.log("123")})//的伪代码PromiseResolveThenableJob可以理解为promiseB.then(()=>{resolvePromiseA,rejectPromiseA})更多学习笔记请点这里~