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

【前端】本文彻底学习Promise

时间:2023-03-28 15:00:43 HTML

作者:D827来源:恒生LIGHT云社区阅读源码后没有不能使用的功能。所以看完这篇文章,希望能帮助大家彻底掌握Promise。Promise简介Promise对象是ES6提供的一种实现异步的解决方案,可以让异步方法像同步方法一样返回值。Promise是一个构造函数,包装(封装)了一个异步函数(ajax;定时器;数据库读取;fs文件读取),当然它也可以包装一个非异步函数。输入参数是两个函数:resolve和reject。调用resolve并传递参数成功,调用reject传递参数失败。使用.then作为回调结果处理,then接受两个函数参数,第一个参数接受正确的返回结果,第二个函数接受错误的返回结果。Promise三种状态:pending、fullfilled/resolved、rejectedPromise初始状态为pending,通过resolve方法将状态变为fullfilled/resolved;通过reject改变状态为rejectedpromise优点:可以实现链式调用,解决回调实现异步所产生的回调地狱问题。promise的缺点:无法监控进度状态,新建立即执行,无法取消;如果没有设置回调函数,Promise内部抛出的错误不会反映到外部;有时可能会导致多次then链调用,导致代码语义不够清晰。Promise的基本使用functionsleep(data){returnnewPromise((resolve,reject)=>{//newPromise可以包装一段异步代码或者一段同步代码//代码执行成功setTimeOut(()=>{letresult=nullif(1){resolve(result)}else{reject(result)}},1000)})}sleep(1000).then(v=>{//正确返回处理},e=>{//错误返回处理}).then(v=>{}).then(v=>{})…….catch(e=>{//错误处理})自定义Promise需要注意的问答Howto修改承诺的状态?多次调用resolve和reject修改状态?多次调用resolve和reject是否可以修改state?执行then和when获取数据可能会发生。当promise包内容为异步时,先指定then再修改状态,否则先修改状态再执行then;执行回调后获取数据。promise.then返回一个promise,返回的结果类型由谁返回一个promise决定,return由返回的promise决定为非promise,则返回resolvedpromise如何连接多个操作任务,因为promise.then返回一个新的Promise对象,所以也可以调用then来实现链式调用promise异常穿透的意思就是不管then有多少,then中间的任何错误都会被catch捕获如何终止promise中的任何异常然后链;在任何then中将promise的状态更改为pending。Promise的自定义//声明构造函数Promise(executor){//添加属性this.PromiseState='pending';this.PromiseResult=null;//声明属性回调有多种情况this.callbacks=[];//保存实例对象this的值constself=this;//self_thisthat//解析函数functionresolve(data){//判断状态多次调用resolve和reject不能修改状态if(self.PromiseState!=='pending')return;//1。修改对象的状态(promiseState)self.PromiseState='fulfilled';//resolved//2.设置对象结果值(promiseResult)self.PromiseResult=data;//成功调用回调函数setTimeout(()=>{self.callbacks.forEach(item=>{item.onResolved(data);});});}//拒绝函数functionreject(data){//判断状态if(self.PromiseState!=='pending')return;//1。修改对象的状态(promiseState)self.PromiseState='rejected';////2.设置对象结果值(promiseResult)self.PromiseResult=da塔;//执行失败回调setTimeout(()=>{self.callbacks.forEach(item=>{item.onRejected(data);});});}try{//同步调用“执行函数”executor(resolve,reject);}catch(e){//修改promise对象的状态为“失败”reject(e);}}//添加then方法Promise.prototype.then=function(onResolved,onRejected){constself=this;//判断回调函数参数if(typeofonResolved!=='function'){onResolved=reason=>{throwreason;}}if(typeofonResolved!=='function'){onResolved=value=>value;//值=>{返回值};}returnnewPromise((resolve,reject)=>{//封装函数functioncallback(type){try{//获取回调函数的执行结果letresult=type(self.PromiseResult);//判断if(resultinstanceofPromise){//比如结果是一个Promise类型的对象result.then(v=>{resolve(v);},r=>{reject(r);})}else{//result的对象状态为“成功”resolve(结果);}}赶上(e){拒绝(e);}}//回调函数PromiseStateif(this.PromiseState==='fulfilled'){setTimeout(()=>{callback(onResolved);});}if(this.PromiseState==='rejected'){setTimeout(()=>{callback(onRejected);});}//判断pending状态if(this.PromiseState==='pending'){//异步情况下一个保存回调函数执行异步执行结束后的回调函数this.callbacks.push({onResolved:function(){回调(onResolved);},onRejec泰德:函数(){回调(onRejected);}});}})}//添加捕获方法Promise.prototype.catch=function(onRejected){returnthis.then(undefined,onRejected);}//添加resolveMethodPromise.resolve=function(value){//返回promise对象returnnewPromise((resolve,reject)=>{if(valueinstanceofPromise){value.then(v=>{resolve(v);},r=>{reject(r);})}else{//状态设置为成功resolve(value);}});}//添加拒绝方法Promise.reject=function(reason){returnnewPromise((resolve,reject)=>{reject(reason);});}//添加所有方法Promise.all=function(promises){//返回结果是promise对象returnnewPromise((resolve,reject)=>{//statementVariableletcount=0;letarr=[];//遍历(让i=0;i{//知道对象的状态是成功的//每个promise对象都是成功的count++;//将当前promise对象的成功结果存入数组arr[i]=v;//判断if(count===promises.length){//修改状态resolve(arr);}},r=>{reject(r);});}});}//添加比赛方法Promise.race=function(promises){returnnewPromise((resolve,reject)=>{for(leti=0;i{//修改返回对象的状态为“成功”resolve(v);},r=>{//修改返回对象的状态为“失败”reject(r);})}});}希望以上内容对您有所帮助!想从科技巨头那里了解更多?开发中遇到的问题在哪里讨论?如何获取海量金融科技资源?恒生LIGHT云社区,恒生电子打造的金融科技专业社区平台,分享实用技术干货、资源数据、金融科技行业动态,欢迎各位金融开发者扫描下方小程序二维码加入我们!