Promise从入门到精通概念Promise是ES6引入的一种新的异步编程解决方案,可以对结果进行处理。Promise最大的好处:可以解决回调地狱的问题,在指定回调和错误处理上更加灵活方便。回调地狱的典型情况:什么是异步编程?答:fs文件操作、数据库操作、AJAX、定时器等为什么要用Promise?指定回调函数的方式更加灵活。旧方式:必须在启动异步任务前指定Promise:启动异步任务=>返回promise对象=>将回调函数绑定到promise对象(甚至可以在异步任务结束后指定多个回调)支持链式调用,可以解决回调地狱的问题。回调地狱的缺点:1)不易阅读;2)不容易处理异常。Promise的基本流程。】pendingundecidedfulfilledsuccessfulrejectedrejected1.pending=>fulfilled2.pending=>rejectedpromise对象的状态只能通过这两种方式改变,一个promise对象的状态只能改变一次。可以从fulfilled转rejected,不可能从rejected转fulfilledpromise对象result值属性介绍实例对象中的另一个属性:[PromiseResult]保存成功/失败resolve的结果可以修改PromiseResult的值rejected可以修改PromiseResult如何使用Promise?API1.Promise构造函数:Promise(exector){}1)exector函数:调用executor函数(resolve,reject)=>{}2)resolve函数:定义在Promise内部,当它成功时我们调用resolve函数3)reject函数:它定义在Promise内部,当它失败时我们调用reject函数说明:Promise内部会立即同步调用exector,异步操作会在executor中执行回调函数value=>{}2)onRejected函数:指定失败的回调函数原因=>{}说明:指定获取成功值的成功回调和获取失败原因的失败回调,并返回一个新的promise对象3.Promise.prototype.catch方法:(onRejected)=>{}onRejected函数:指定失败的回调函数reason=>{}说明:then()的语法糖,相当于then(undefined,onRejected)4.Promise.resolve方法(value)=>{}1)value:成功的数据或promise对象描述:返回一个成功/失败的promise对象功能:快速获取一个promise对象,可以封装1个值,将这个值转换成promise对象如果传入参数是非promise类型的对象,则返回结果为成功的承诺eobject如果传入的参数是一个promise对象,参数的结果决定了result5.Promise.reject方法:(reason)=>{}功能:快速返回一个失败的promise对象返回的结果永远是一个失败的promiseobject6.Promise.all方法:(promisesarray)=>{}参数:一个包含n个promises的数组描述:返回一个新的promise对象,只有所有promise都成功才成功,只要有一个promise失败就成功会直接失败7.Promise.race方法:(arrayofpromises)=>{}race有竞速的意思参数:包含n个promises的数Group说明:返回一个新的promise对象,第一个改变状态的promise就是最终结果状态promise的几个关键问题1.如何改变promise的状态?(1)resolve(value):如果当前状态isPendingwillbefulfilled(2)reject(reason):如果当前处于pending状态,则变为rejected(3)抛出异常:如果当前处于pending状态,则变为rejected2.一个promise指定多次成功/failure回调函数会被调用吗?promise变为相应状态时会被调用吗?改变状态,也可以先改变状态再指定回调(2)如何先改变状态再指定回调?①在executor中直接调用resolve()/reject()②延迟较长时间后调用then()(3)什么时候可以拿到数据?①如果先指定了回调,那么当状态改变时,会调用回调函数获取数据②如果先改变状态,那么当指定回调时,回调函数会被调用,获取数据4.什么决定了promise.then()返回的新promise的结果状态?(1)简单表达式:由then()指定的回调函数的执行结果决定(2)详细表达式:①If抛出异常,新的promise变为rejected,reason为抛出的异常②如果返回promise以外的任何值,则新的promise变为resolved,value为返回值③如果是另一个新的Promise,结果thispromise将成为新promise的结果5.promise如何链接多个操作任务?(1)promise的then()返回一个新的promise,可以开成then()的链式调用(2)通过then的链式调用连接多个同步/异步任务letp=newPromise((resolve,reject)=>{setTimeout(()=>{resolve('ok');},1000);});p.then(v=>{returnnewPromise((resolve,reject)=>{resolve('success');});}).then(v=>{console.log(v);}).then(v=>{console.log(v);})6.promise异常传输?(1)使用promise的then链调用时,可以在最后指定失败的回调,(2)前面操作中的任何异常都会传递给最后一个失败的回调处理letp=newPromise((resolve,reject)=>{reject('err');});p.then(v=>{console.log(111);}).then(v=>{console.log(222);}).then(v=>{console.log(333);}).catch(r=>{console.log(r);});7.打破promise链?(1)当使用promisethen链时调用中途中断,不再调用后续的回调函数(2)方法:在回调函数中返回一个处于pending状态的promise对象代码展示//声明函数执行器“同步回调”functionPromise(executor){//设置实例对象的属性this.PromiseState='pending';this.PromiseResult=undefined;this.callbacks=[];//声明函数constsuccess=(value)=>{if(this.PromiseState!=='pending')return;//修改状态为成功PromiseStatethis.PromiseState='已完成';//设置成功结果值PromiseResultthis.PromiseResult=value;//调用回调if(this.callbacks.length>0){this.callbacks.forEach(cbObj=>{//执行成功CallbackcbObj.ok();})}}constfail=(reason)=>{如果(this.PromiseState!=='pending')返回;//修改状态为失败PromiseStatethis.PromiseState='rejected';//设置成功的结果值PromiseResultthis.PromiseResult=reason;//调用回调if(this.callbacks.length>0){this.callbacks.forEach(cbObj=>{//执行成功回调cbObj.ng();})}}try{//调用执行函数执行者(成功,失败);}catch(e){//调用失败函数fail(e);}}Promise.prototype.then=function(onFulfilled,onRejected){//判断异常渗透if(typeofonRejected!=='function'){onRejected=reason=>{throwreason};}//价值传递if(typeofonFulfilled!=='function'){onFulfilled=value=>value;}returnnewPromise((resolve,reject)=>{//封装函数,简化代码letcallback=(type)=>{try{letres=type(this.PromiseResult);//判断if(resinstanceofPromise){res.then(v=>{resolve(v);},r=>{reject(r);})}else{resolve(res);}}catch(e){reject(e);}}//判断成功if(this.PromiseState==='fulfilled'){setTimeout(()=>{callback(onFulfilled);//})}//失败if(this.PromiseState==='rejected'){setTimeout(()=>{回调(onRejected);})}//pendingif(this.PromiseState==='pending'){//保存回调this.callbacks.push({ok:function(){//成功回调(onFulfilled);},ng:function(){callback(onRejected);}})}});}Promise.prototype.catch=function(onRejected){returnthis.then(undefined,onRejected);}Promise.resolve=function(value){returnnewPromise((resolve,reject)=>{//判断if(valueinstanceofPromise){//value.then(resolve,reject);,r=>{reject(r);});}else{解决(价值);}})}Promise.reject=function(reason){returnnewPromise((resolve,reject)=>{reject(reason);})}Promise.all=function(promiseArr){returnnewPromise((resolve,reject)=>{letcount=0;letarr=[];for(leti=0;i
