位置: IT常识 - 正文

【Promise】一文带你了解promise并解决回调地狱(promise thenable)

编辑:rootadmin
【Promise】一文带你了解promise并解决回调地狱 文章目录Promise为什么需要promise需求回调地狱Promise的基本使用promise实例promise的状态promise状态的改变promise的结果promise方法then方法通过then方法获取promise的结果then方法的返回值catch方法解决回调地狱Promise为什么需要promise需求

推荐整理分享【Promise】一文带你了解promise并解决回调地狱(promise thenable),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:promise.all.then,promise to write,promise to promise,promised by,promise. then,promised by,promise to write,promise. then,内容如对您有帮助,希望把文章链接给更多的朋友!

通过ajax请求id,再根据id请求用户名,再根据用户名获取email

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./jquery-3.6.0.js"></script></head><body> <script> //通过ajax请求拿到用户id $.ajax({ type:"GET", url:"./data1.json", success:function(res){ let {id} = res; console.log(id); //通过用户id找到用户名 $.ajax({ type:"get", url:'./data2.json', data:{id}, success:function(res){ let {username} = res; console.log(username); //通过用户名找到用户邮箱 $.ajax({ type:"GET", url:"./data3.json", data:{username}, success:function(res){ let {email} = res; console.log(email); } }) } }) } }) </script></body></html>回调地狱

在回调函数中嵌套回调 在上述代码中通过不断请求数据,代码逐级向外递归,形成了回调地狱。 使用promise就可以完美解决,并且让我们的代码更加美观。

Promise的基本使用

Promise是一个构造函数,通过new关键字实例化对象. 语法:

new promise((reso1ve,reject)=>{})

Promise接受一个函数作为参数 在参数函数中接受两个参数

resolve:reject:promise实例

promise实例有两个属性:

state:状态result:结果 promise的状态pending(准备,待解决,进行中)fulfilled(已完成,成功)rejected(已拒绝,失败)promise状态的改变

通过调用resolve和reject改变当前promise对象的状态。

改为fulfilledlet p = new Promise((resolve,reject)=>{resolve(); //调用resolve将状态改为fulfilled});console.log(p)

改为rejectedlet p = new Promise((resolve,reject)=>{ reject();//调用reject将状态改为rejected });console.log(p)

注意:promise状态的改变是一次性的,即不能同时调用resolve和reject,若同时调用则状态只改变一次。

promise的结果

promise的结果是通过传递resolve/reject的参数来获得的

let p = new Promise((resolve,reject)=>{ resolve("成功") })console.log(p);

【Promise】一文带你了解promise并解决回调地狱(promise thenable)

同理,reject也是如此:

promise方法then方法

then方法中有两个参数,且都为函数作为参数。 如:

let p = new Promise((resolve,reject)=>{ resolve("成功") })p.then(()=>{ console.log('成功时执行');},()=>{ console.log("失败时执行");})console.log(p);第一个函数参数 当promise的状态为fulfilled时,执行该函数第二个函数参数 当promise的状态为rejected时,执行该函数

通过then方法获取promise的结果

通过then方法中的函数传递形参即可获得promise的结果;

let p = new Promise((resolve,reject)=>{ resolve("成功")})p.then((value)=>{ console.log('成功时执行',value);},(reason)=>{ console.log("失败时执行",reason);})console.log(p);

总结:promise的状态用来判断then方法执行成功或是失败的函数,promise的结果则是作为实参传递给then方法的函数参数的形参。

then方法的返回值

then方法返回的为一个新的promise对象。且该promise对象的状态为pending,then方法为一个同步操作,then中的函数参数为异步操作。

如上图我们就可以看到then方法的返回值仍然为一个promise对象,且在刚生成该对象时的状态为pending。

由此衍生出了链式操作:

new Promise(()=>{}).then().then()

在该操作中,如果promise对象的状态不改变则不会执行then方法中的函数。那么在then方法返回的promise对象中如何让其状态改变呢??

使用return可以将then方法返回的promise对象状态改为fulfilled。在then方法中书写错误代码,即可将其promise对象状态改为rejected

实例:

let p = new Promise((res,rej)=>{res('苏凉');})let t = p.then((value)=>{ return "name:"+value;},(reason)=>{ console.log("执行失败!");})t.then((value)=>{ console.log(value);},(reason)=>{ console.log(reason);})console.log(t);

catch方法

catch方法在promise对象的状态为rejected时亦或者是输入错误代码时被调用,并返回错误原因。

let p = new Promise((res,rej)=>{ throw newError("出错啦!")})p.catch((reason)=>{ console.log(reason);})console.log(p);

解决回调地狱//封装Ajax请求函数function getAjax(path,data){ return new Promise((resolve,reject)=>{ $.ajax({ type:'get', url:path, data:{data}, success:function(res){ resolve(res) }, error:function(res){ reject(res) } }) })}getAjax('./data1.json').then((value)=>{ let id = {value}; return getAjax("./data2.json",id)}).then((value)=>{ let {username} = value; return getAjax('./data3.json',username)}).then((value)=>{ console.log(value);})

本文链接地址:https://www.jiuchutong.com/zhishi/298703.html 转载请保留说明!

上一篇:【AIGC】大模型协作系统 HuggingGPT 深度解析(dac模型)

下一篇:uniapp自定义导航渐显渐隐效果实现(uniapp自定义导航栏渐变)

  • div+css网页设计了解自己企业网站建设的需求(分刚需和二需)

    div+css网页设计了解自己企业网站建设的需求(分刚需和二需)

  • 荣耀70pro怎么固定屏幕不旋转(荣耀7怎么设置锁屏壁纸)

    荣耀70pro怎么固定屏幕不旋转(荣耀7怎么设置锁屏壁纸)

  • 小爱课程表怎么添加到桌面(小爱课程表怎么清除)

    小爱课程表怎么添加到桌面(小爱课程表怎么清除)

  • 华为手机为什么发烫(华为手机为什么没有无线调试)

    华为手机为什么发烫(华为手机为什么没有无线调试)

  • 用红包买的东西,退款后还能用吗(用红包买的东西退款后红包还在吗)

    用红包买的东西,退款后还能用吗(用红包买的东西退款后红包还在吗)

  • 小米拦截返回音改不了怎么办(小米拦截返回音改不了)

    小米拦截返回音改不了怎么办(小米拦截返回音改不了)

  • 苹果11拍照支持曝光吗(iphone11的拍照能力)

    苹果11拍照支持曝光吗(iphone11的拍照能力)

  • ppt保存快捷键ctrl加什么(ppt保存快捷键不见了)

    ppt保存快捷键ctrl加什么(ppt保存快捷键不见了)

  • 怎么隔空传送相片(隔空投送怎么传相册)

    怎么隔空传送相片(隔空投送怎么传相册)

  • 红米note7屏幕残影解决方法(红米note7有残影怎么解决)

    红米note7屏幕残影解决方法(红米note7有残影怎么解决)

  • 哔哩哔哩等级有什么用(哔哩哔哩等级有多少)

    哔哩哔哩等级有什么用(哔哩哔哩等级有多少)

  • 苹果x电池显示维修什么意思(苹果X电池显示维修怎么办)

    苹果x电池显示维修什么意思(苹果X电池显示维修怎么办)

  • 微信不加好友能否建群聊(微信不加好友能发信息吗)

    微信不加好友能否建群聊(微信不加好友能发信息吗)

  • 华为nova5Pro喇叭有滋滋声(nova5pro喇叭不正常了)

    华为nova5Pro喇叭有滋滋声(nova5pro喇叭不正常了)

  • 录音设备被占用是怎么回事(录音设备被占用或出现异常怎么办)

    录音设备被占用是怎么回事(录音设备被占用或出现异常怎么办)

  • 7p是不是7plus(7p是不是双卡双待)

    7p是不是7plus(7p是不是双卡双待)

  • 选定整个文档的快捷键(新建文档)

    选定整个文档的快捷键(新建文档)

  • 显卡后面的f是什么意思(显卡后面的f是啥意思)

    显卡后面的f是什么意思(显卡后面的f是啥意思)

  • 下单是什么意思(候补下单是什么意思)

    下单是什么意思(候补下单是什么意思)

  • 华为移动服务是什么功能(华为移动服务是干嘛的)

    华为移动服务是什么功能(华为移动服务是干嘛的)

  • 小米手机4g断流怎么解决(小米手机断流问题)

    小米手机4g断流怎么解决(小米手机断流问题)

  • 苹果x三维触控怎么打开(苹果三维触控调高还是低比较好)

    苹果x三维触控怎么打开(苹果三维触控调高还是低比较好)

  • 9400f支持3200内存吗(9400f用3000hz内存)

    9400f支持3200内存吗(9400f用3000hz内存)

  • 华为手环5nfc功能是什么(华为手环5 nfc功能)

    华为手环5nfc功能是什么(华为手环5 nfc功能)

  • 小爱音响怎么绑定qq音乐(小爱音响怎么绑定手机app)

    小爱音响怎么绑定qq音乐(小爱音响怎么绑定手机app)

  • pr项目设置在哪(pr2019项目设置在哪里)

    pr项目设置在哪(pr2019项目设置在哪里)

  • 朋友圈别人回复可以删除吗(朋友圈别人回复的消息在哪里看)

    朋友圈别人回复可以删除吗(朋友圈别人回复的消息在哪里看)

  • 华为手机圆圈快捷键在哪里设置(华为手机 圆圈)

    华为手机圆圈快捷键在哪里设置(华为手机 圆圈)

  • 如何拼接视频(iPhone如何拼接视频)

    如何拼接视频(iPhone如何拼接视频)

  • 怎么加页码首页不加(然后添加页码)

    怎么加页码首页不加(然后添加页码)

  • Windows 10如何开启系统开机音乐(windows10如何开启wifi)

    Windows 10如何开启系统开机音乐(windows10如何开启wifi)

  • 固定资产安装费用怎么处理
  • 农产品开具发票税率是多少
  • 建筑安装服务的发票
  • 开专用发票可以直接写加工费这个明细吗
  • 增值税附表一填错了,主表没错可以不更正不
  • 保险经纪公司要取得什么证
  • 胶水开票开什么类目
  • 公司团建取得的进项发票可以抵扣增值税吗
  • 所得税申报更正申报怎么报?
  • 保证金利息收入怎么算
  • 桐木板芯销售
  • 餐饮企业原材料四大类
  • 在途物资的运费放在哪个科目
  • 供应商提供财务报表
  • 亏损企业研发费加计扣除可以递延吗
  • 单位聘请的临时工请假旅游
  • 公司租房子出去物业费可以代付吗
  • 往来核算在会计哪个科目
  • 存货跌价卖出需要进项转出吗
  • 现金报销银行账户
  • 国际货运代理免税
  • 幼儿园是否缴纳残疾人保障金
  • 发票纳税人识别号在哪里看
  • 母公司代付子公司费用的委托书
  • 子公司的注册资金需要母公司股东出吗?
  • deepin切换系统
  • 存货对外销售会计分录
  • 购买产品优惠计入什么科目
  • 停止维护win7
  • linux sar文件
  • PHP:Memcached::incrementByKey()的用法_Memcached类
  • avgserv9.exe是什么进程 avgserv9进程的详细介绍
  • 银行对公中收
  • 事业单位无职务人员称什么
  • 总部资产减值测试例题
  • 应收账款应付账款属于什么科目
  • phpcms 还有人用吗
  • nginx for linux
  • dede转zblog
  • 增值税免税申报
  • 预提费用待摊费用改为什么科目
  • 公司名义送花圈
  • 小规模开票软件怎么升级
  • 新会计准则下的资产负债表
  • 自产和外购用于赠送
  • 个人申请退税要交税吗
  • java实现打印
  • 可供出售金融资产属于什么科目
  • 武汉营业执照注销流程
  • 商品周转天数计算方法
  • 高价卖股份犯法么
  • 购入房屋建筑物进项税额抵扣
  • 机票改签手续费有报销凭证吗
  • SQL语句查询数据量
  • xp系统没有安装好,请重新运行安装程序
  • vim如何操作
  • mmc无法创建管理单元怎么办win11
  • win2玩魔兽世界
  • rdesktop命令
  • 定制xp系统
  • win10系统wifi信号断断续续
  • cocos做游戏
  • 在解决ul居中问题时想到的几点
  • node.js使用的v8引擎是由哪个公司开发的
  • css常用布局方式
  • 超详细的!!!2023澳门六开彩
  • 批处理是什么
  • 木瓜电子
  • Android Listview addHeaderView setadapter的时候莫名NullPointerException 解决
  • 简述javascript中的函数
  • js使用类
  • java 使用jar包
  • 河北地方税务局吴瑜
  • 残疾人可以免增值税吗
  • 火药概念股有哪些
  • 纳税人欠缴税款数额在10万元以上
  • 河北省职称证去哪里查
  • 网上如何申请
  • 国税局发票查询电话
  • 电子秒表怎么读数9:33.12
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设