Promise简介什么是Promise?解决了哪些问题?回调地狱,代码不易维护,错误处理很麻烦,无法统一处理多个请求的错误处理。ES6把它写进了语言标准,统一使用,原生提供Promise对象。Promise是一个对象。在使用new时,Promise在使用newPromise时传入一个executor,即executor。这个函数在创建新的Promise时立即执行Promise。Promise的executor函数有两个参数,一个是resolve,一个是reject。resolve将Promise从pending状态更改为fulfilled状态,并reject将Promise从pending状态更改为rejected状态。resolve和reject由Promise提供。Promise的3种状态:pending等待状态,fulfilled成功状态,rejected失败状态Promiseresolve或reject只能调用一次,一旦成功就不能再失败,一旦失败就不能再成功。每个Promise实例都有一个then()方法,该方法内部传递了两个函数,第一个是成功回调函数,第二个是失败回调函数。如果Promise失败,您可以调用reject或抛出错误。Promise的then()方法返回一个新的。Promise,所以then()可以再次使用then//定义三种状态constREJECTED='REJECTED';constFULFILLED='FULFILLED';constPENDING='PENDING';/***判断变量是否为Promise的函数*1.是否为对象且不为null*2.是否有then属性,then是否为方法*@param{*}val*/functionisPromise(val){if(typeofval==='object'&&val!==null||typeofval==='function'){returntypeofval.then==='function';}返回假;}console.log('------------------------我的承诺--------------------');//实现链式调用/***在then中处理成功和失败回调函数的返回值是否为Promise*@param{*}promise2参考PromiseA+规范newPromise*@param{*}x为成功或失败回调的返回值*/constresolvePromise=(promise2,x)=>{const{resolve,reject}=prom是2;//这里的判断是自己的Promise可能和别人的Promise混在一起,不同的Promise库可能会互相调用//如果新的Promise2和x一样,那么x永远不会成功也不会失败,所以If(promise2===x)returnreject(newTypeError('Chainingcycledetectedforpromise#'));//需要判断x的状态,判断x是否是Promise//先判断是对象还是函数if(typeofx==='object'&&x!==null||typeofx==='函数'){让调用;//这里考虑别人的Promise是否健壮再判断,调用成功不能失败,调用失败不能成功不能多次调用成功或失败try{constthen=x.then;//里面可能会报错//如果then不是函数,说明是普通值,直接返回xif(typeofthen!=='function')resolve(x);//例如:{then:'mhq'}else{//这里不要再次调用x.then以防止获取then时出错。如果then方法抛出错误怎么办?then.call(x,y=>{if(called)return;called=true;//如果x是Promise,则继续解析成功值resolvePromise(promise2,y);},f=>{if(called)return;called=true;reject(f);//失败直接调用r});}}catch(err){如果(调用)返回;称为=真;拒绝(错误);}}else{解决(x);}};classPromise{constructor(executor){//Promise的状态this.status=PENDING;//成功后的值this.value=undefined;//失败后的值this.reason=undefined;//成功回调函数,发布订阅this.onResolvedCallbacks=[];//失败回调函数,发布订阅this.onRejectedCallbacks=[];/***Promise内部提供的resolve使Promise的状态变为成功,并使成功的回调执行*@param{*}value*/constresolve=value=>{if(valueinstanceofPromise){returnvalue.then(解决,拒绝);}if(this.status===PENDING){this.status=FULFILLED;this.value=值;this.onResolvedCallbacks.forEach(fn=>fn());}};/***Promise内部提供的reject使Promise的状态失败并让失败回调执行*@param{*}reason*/constreject=reason=>{if(this.status===PENDING){this.status=已拒绝;this.reason=原因;this.onRejectedCallbacks.forEach(fn=>fn());}};//try+catch只能捕获同步异常try{executor(resolve,reject);}catch(err){拒绝(err);}}//只要x是一个普通的值,就会让一个Promise变得成功//这个x可能是一个Promise,需要这个Promisesthen(onFulfilled,onRejected)的状态{//例如。=“功能”?onFulfilled:val=>val;onRejected=typeofonRejected==='函数'?onRejected:错误=>{抛出错误};constpromise2=newPromise((resolve,reject)=>{//一旦new立即执行if(this.status===FULFILLED){setTimeout(()=>{promise2.resolve=resolve;promise2.reject=reject;try{constx=onFulfilled(this.value);resolvePromise(promise2,x);}catch(err){reject(err);}},0);}if(this.status===REJECTED){setTimeout(()=>{promise2.resolve=resolve;promise2.reject=reject;try{constx=onRejected(this.reason);resolvePromise(promise2,x);}抓住(错误){拒绝(错误);}},0);}if(this.status===PENDING){//本身是异步的this.onResolvedCallbacks.push(()=>{setTimeout(())=>{//这里需要加,如果不加,测试将不起作用。promise2.resolve=resolve;promise2.reject=reject;try{constx=onFulfilled(this.value);resolvePromise(promise2,x);}catch(err){reject(err);}});});this.onRejectedCallbacks.push(()=>{setTimeout(()=>{promise2.resolve=resolve;promise2.reject=reject;try{constx=onRejected(this.reason);resolvePromise(promise2,x);}抓住(错误){拒绝(错误);}});});}});回报承诺2;}/***公关omise中的catch指的是then不成功回调的别名*@param{*}errCallback*/catch(errCallback){returnthis.then(null,errCallback);}}//反正都会执行,把前面then的结果传下去。如果finally返回了一个Promise,它会等待Promise完成,继续执行Promise.prototype.finally=function(callback){returnthis.then(val=>{returnPromise.resolve(callback()).then(()=>val);},(err)=>{returnPromise.resolve(callback()).then(()=>{throwerr;});});};//npminstallpromises-aplus-tests-g//promises-aplus-testspromise.js//测试你写的Promise是否符合规范的包Promise.deferred=()=>{constdfd={};dfd。promise=newPromise((resolve,reject)=>{dfd.resolve=resolve;dfd.reject=reject;});返回dfd;};/***Promise.resolve会等待里面的Promise执行成功*@param{*}val*/Promise.resolve=val=>{returnnewPromise((resolve)=>{resolve(val);});};/***承诺。拒绝不会等待参数中的Promise完成*/Promise.reject=()=>{returnnewPromise((_,reject)=>{reject(val);});};/***Promise.all方法表示只有所有的Promise都成功后才会执行回调。如果Promise失败,则Promise将失败*@param{*}promises*/Promise.all=promises=>{returnnewPromise((resolve,reject)=>{constres=[];letcount=0;constresolveRes=(index,data)=>{res[index]=data;if(++count===promises.length){resolve(res);}};for(leti=0;i{resolveRes(i,data);},(err)=>{reject(err);});}else{resolveRes(i,current);}}});}/***Promise.race,谁第一个完成,就用他的结果,如果失败,则Promise失败,如果第一个成功,则成功*@param{*}promises*/Promise.race=(promises)=>{returnnewPromise((resolve,reject)=>{for(leti=0;i{return(...arg)=>{returnnewPromise((resolve,reject)=>{fn(...arg,(err,data)=>{if(err)reject(err);resolve(data);});});}};module.exports=承诺;