位置: 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自定义导航栏渐变)

  • 小规模企业每月能开多少专票
  • 办公家具发票要交税吗?
  • 什么是长期股权结构
  • 个人生产经营所得税计算器
  • 对方只能开普票怎么办
  • 集团内部公司之间怎么称呼
  • 抵债资产涉税问题
  • 营改增后甲供材如何扣除
  • 生产设备购买交付会计分录
  • 租赁的设备伤人了谁的责任
  • 哪些营业外收入需要缴纳增值税
  • 工资扣除水电费扣个税
  • 营业外收入做多了怎么办
  • 企业取得的信托计划分红缴企业所得税吗
  • 应交税费明细科目有简易计税吗
  • 中药税率什么时候变为9
  • 利润表的税金及附加怎么得出来
  • 银行呆帐坏账
  • 核定征收要交企业所得税吗
  • 出纳能不能兼开专票
  • rancher2教程
  • 手机CPU天梯图2023年7月
  • 公司总部固定资产折旧
  • 提示语是什么意思?
  • qqlogin.exe是什么进程 qqlogin.exe应用程序错误解决办法
  • 冲往年管理费用的账务处理是否涉及所得税
  • 个人医疗保险怎么取出来
  • 肚子胀气怎么办 4个方法快速排气很轻松
  • 建筑工程甲级什么意思
  • 得了遗尿症应该怎么办
  • 会计如何分录
  • php微信公众号获取带参二维码
  • series转换为dataframe
  • 增值税政策执行口径存在的问题及建议
  • 织梦下载站源码带采集
  • 老板天天吸烟
  • 优先股股息必须支付吗
  • python的utils模块
  • 织梦如何添加浮动广告
  • 应收账款与营业收入比例分析
  • 货款必须对公帐户支付吗
  • 其他权益工具投资
  • 减免申报明细表怎么填
  • 公司首次申报个人所得税
  • 带薪年假一般是什么时候
  • 个人申请代开发票流程怎么操作?
  • 企业增值税包含哪些税项及税率
  • 企业关联业务往来情况怎么申报
  • 计入资本公积的固定资产处置
  • 实收资本的印花税什么时候申报
  • 境外劳务输出收费表标准
  • 房地产企业内部控制的现状
  • 个人垫付的费用如何向单位报销行政单位
  • 自产产品用于职工食堂,确认收入吗
  • 预缴的税款抵扣有时间限制吗
  • 车间成本核算表
  • 明细账要如何做账
  • sql比较数值大小
  • sqlsever导入数据时出现ole db连接数据无效
  • sql语句提取字符串中数字
  • win7旗舰版系统激活码
  • XP系统怎么设置双屏幕
  • 苹果的os什么意思
  • freebsd中文手册
  • 如何给电脑重装系统win7系统
  • windows无法启动怎么解决
  • 苹果mac怎么查看运行数据
  • 如何去掉windows不是正版
  • 工商网银安装
  • 安卓十游戏怎么玩
  • Node.js中的事件循环是什么意思
  • listview点击获取内容
  • vscode 远程调试jni
  • unity3d怎么用
  • 常见的shell脚本
  • python 数据结构 算法
  • javascript要怎么学
  • 证券经纪人收入构成
  • 进项税额包括哪些项目
  • 企业所得税按开票金额的多少计算税率
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设