当前位置: 首页 > Web前端 > vue.js

Promise.resolve()和newPromise(r=-r(v))

时间:2023-03-31 21:45:46 vue.js

Promise.resolve方法的参数分为四种情况。该参数是一个Promise实例。如果参数是Promise实例,那么Promise.resolve将返回实例而不做任何修改。这是一个特例,它将与另一个新的Promise(r=>r(v))产生不同的效果。最后,参数是一个thenable对象。thenable对象指的是有then方法的对象,比如下面这个对象letthenable={then:function(resolve,reject){resolve(42);}};Promise.resolve方法会把这个对象转成Promise对象,然后马上执行thenable对象的then方法。让thenable={那么:函数(解决,拒绝){解决(42);}};letp1=Promise.resolve(thenable);p1.then(function(value){console.log(value);//42});thenable对象的then方法执行后,对象p1的状态变为resolved,从而立即执行最后一个then方法指定的回调函数,输出的42参数不是有then方法的对象,或者根本不是一个对象。如果参数是原始值,或者没有then方法的对象,Promise.resolve方法返回一个状态为resolved的新Promise对象。constp=Promise.resolve('Hello');p.then(function(s){console.log(s)});//Hello不是异步操作,因为字符串Hello(判断方法是字符串object没有then方法),返回的Promise实例的状态从生成的那一刻起就解析了,所以会执行回调函数。Promise.resolve方法的参数会在没有任何参数的情况下同时传递给回调函数。Promise.resolve方法允许无参调用,直接返回一个已解析状态的Promise对象。setTimeout(function(){console.log('三');},0);Promise.resolve().then(function(){console.log('二');});console.log('一');//one//two//three.then()函数没有返回值或者返回promise,那么then返回的Promise会变成接受状态(resolve)Promise.resolve().then(()=>console.log(2)).then(()=>console.log(3));console.log(1);//1,2,3需要注意的是,立即解析的Promise对象是在本轮“事件循环”结束时执行的,不是立即执行的,也不是在下一轮“事件循环”开始时执行的原因:传递给then()的函数被放在一个微任务队列中,而不是立即执行,这意味着它会在JavaScript事件队列的所有运行时间结束并且事件队列清空后开始执行。Promise.resolve(v)isnotequaltonewPromise(r=>r(v))当v是一个Promise实例时有些不同//v是一个实例化的promise,并且状态是fulfilledletv=newPromise(resolve=>{console.log("begin");resolve("then");});//resolve一个状态为fulfilledinpromise的promise//resolve()inmode1newPromise//begin->1->2->3->then->4可以发现then推迟了两个时机//延迟的原因:浏览器会创建一个PromiseResolveThenableJob来处理这个Promise实例,这是一个microtask。//这个微任务会在下一个周期到来时执行,也就是PromiseResolveThenableJob正在执行的时候,因为这个Promise实例是fulfilled状态,所以会注册另一个.then()回调//等待另一个周期到这个Promise它的.then()回调执行后,后面的.then()会被注册,所以会延迟两次newPromise(resolve=>{resolve(v);}).then((v)=>{console.log(v)});//方式二Promise.resolve(v)直接创建//begin->1->then->2->3->4可以发现then的执行时间正常,最先执行的microtask如下。then//原因:如果Promise.resolve()接口的参数是promise,则不做任何处理直接返回promise实例/*Promise.resolve(v).then((v)=>{console.log(v)});*/newPromise(resolve=>{console.log(1);resolve();}).then(()=>{console.log(2);}).then(()=>{console.log(3);}).then(()=>{console.log(4);});resolve()resolve()的本质是为了表示promise的状态是fullfilled,相当于定义了一个有状态的Promise,但是并没有调用它;thenfrompromise调用的前提是promise状态为fullfilled;只有当promise调用then时,then中的函数才会被调用push到微任务中;