位置: IT常识 - 正文

ES6---promise详解及用法(es6 promise finally)

编辑:rootadmin
ES6---promise详解及用法 一、什么是Promise

推荐整理分享ES6---promise详解及用法(es6 promise finally),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:es6 详解,es6 详解,es6 from,es6 promise.all,es6 from,es6 promise finally,es6 promise finally,es6 promise finally,内容如对您有帮助,希望把文章链接给更多的朋友!

Promise是ES6异步编程的一种解决方案(目前最先进的解决方案是async和await的搭配(ES8),但是它们是基于promise的),从语法上讲,Promise是一个对象或者说是构造函数,用来封装异步操作并可以获取其成功或失败的结果。  

二、为什么要使用promise

最重要也是最主要的一个场景就是ajax和axios请求。通俗来说,由于网速的不同,可能你得到返回值的时间也是不同的,但是我们下一步要执行的代码依赖于上一次请求返回值,这个时候我们就需要等待,结果出来了之后才知道怎么样继续下去。 

三、promise的好处

1.可以避免多层异步调用嵌套问题(回调地狱) 2.Promise 对象提供了简洁的API,使得控制异步操作更加容易(js执行机制导致的异步问题)这两点在我ES6专栏的相关文章有很详细的介绍,这里就不展开了

 四、promise的三种状态

Promise对象有三种状态,他们分别是:

1.pending: 等待中,或者进行中,表示还没有得到结果 2.resolved(Fulfilled): 已经完成,表示得到了我们想要的结果,可以继续往下执行 3.rejected: 也表示得到结果,但是由于结果并非我们所愿,因此拒绝执行 

这三种状态不受外界影响,而且状态只能从pending改变为resolved或者rejected,并且不可逆

五、promise的用法 1.promise的实例方法

①then()得到异步任务的正确结果

②catch()获取异常信息

③finally()成功与否都会执行(尚且不是正式标准)  注意:then方法可以接受两个函数,第一个函数为promise状态为成功的回调函数,第二个函数为promise状态为失败的回调函数(可以不写,一般用catch方法捕获promise状态为失败的异常信息)

 2.promise的对象方法(p1,p2,p3为promise的实例对象)

①Promise.all()并发处理多个异步任务,所有任务都执行完成才能得到结果

Promise.all( [p1,p2,p3] ) .then ( (result) => {consoleog (result)})

②Promise.race()并发处理多个异步任务,只要有一个任务完成就能得到结果  

Promise.race ( [p1,p2,p3] ).then ( (result)=>{console. log (result)})六、promise的特点 1.在Promise对象的构造函数中,将一个函数作为第一个参数。2.而Promise对象的构造函数的第一个参数中的这个函数,就是用来处理Promise的状态变化,这个函数的第一个参数表示promise的状态为成功,第二个参数表示promise的状态为失败,这两个参数(名字可以自己命名)都为一个函数,他们的作用分别是将promise状态修改为resolved(成功)和rejected(失败)。 <script> function fn(flag) { //构造函数 return new Promise(function(resolve, reject) { if (flag === true) { resolve('promise状态为成功!') }; if (flag === false) { reject('promise状态失败!') }; }) } console.log(fn(true)); </script>

 控制台运行:

3. Promise对象中的then方法,可以接收构造函数中处理的状态变化,并分别对应执行。then方法有2个函数参数,第一个函数接收resolved(promise状态为成功)的执行,第二个函数接收reject(promise状态为失败)的执行。  <script> function fn(flag) { return new Promise(function(resolve, reject) { if (flag === true) { resolve('promise状态为成功!') }; if (flag === false) { reject('promise状态失败!') }; }).then(function(res) { console.log(res); }, function(err) { console.log(err); }) } fn(true) fn(false) </script>ES6---promise详解及用法(es6 promise finally)

控制台运行:

4.promise的状态只能从 未完成->完成, 未完成->失败 且状态不可逆转。promise的异步结果,只能在完成状态时才能返回,而且我们在开发中是根据结果来选择来选择状态的,然后根据状态来选择是否执行then()。实例化的Promise内部会立即执行,then方法中的异步回调函数会在脚本中所有同步任务完成时才会执行。因此,promise的异步回调结果最后输出。示例代码如下:  var promise = new Promise(function(resolve, reject) { console.log('Promise instance'); resolve();});promise.then(function() { console.log('resolved result');});for(var i=0;i<100;i++) {console.log(i);/*Promise instance123...99100resolved result*/ 5.Promise.then()方法

①then()函数返回的实际也是一个Promise对象(无论函数内部返回什么类型的数据,函数都会进行加工返回一个promise对象)

<script> function fn(flag) { return new Promise(function(resolve, reject) { if (flag === true) { resolve('promise状态为成功!') }; if (flag === false) { reject('promise状态失败!') }; }) } console.log(fn(true).then()); </script>

控制台运行:

 

 ②then()函数内部返回为普通值(非Promise类型的属性),返回的普通值会直接传递给下一个then,通过then参数中函数的参数接收该值。

这时then()函数返回的Promise对象状态为成功(resloved),then()函数的返回值为对象的成功值,如return 123,返回的Promise对象值为123,如果没有返回值,是undefined

<script> const p = new Promise((resolve, reject) => { setTimeout(() => { resolve('用户数据'); }) }); let result = p.then(value => { return 123; }, reason => { console.log(reason) }) console.log(result); result.then(function(res) { console.log(res); }) </script>

控制台运行:

  

③ 当then()函数内部返回的是Promise类型的对象时,then()函数的返回的Promise对象的状态值为这个Promise对象的状态值,成功值也是如此,返回的该promise对象会调用下一个then方法。

<script> const p = new Promise((resolve, reject) => { setTimeout(() => { resolve('用户数据'); }) }); let result = p.then(value => { return new Promise((resolve, reject) => { resolve('ok') }) }, reason => { console.log(reason) }) console.log(result); result.then(function(res) { console.log(res); }) </script>

控制台运行:

 

 ④当then()函数内部果抛出异常,则then()函数的返回值状态也是rejected

<script> const p = new Promise((resolve, reject) => { setTimeout(() => { resolve('用户数据'); }) }); let result = p.then(value => { throw 123 }, reason => { console.log(reason) }) console.log(result); </script>

控制台运行:

 

6.Promise.catch()方法

①catch()函数只有一个回调函数,意味着如果Promise对象状态为失败就会调用catch()方法并且调用回调

//catch()函数只有一个回调函数,意味着如果Promise对象状态为失败就会调用catch()方法并且调用回调函数<script>const p = new Promise((resolve, reject) => {setTimeout(()=>{reject('出错啦')},1000)})p.catch(reason => {console.log(reason)})</script>

控制台运行:   

七、总结1.promise其实就是一个对象或者说是构造函数2.promise的出现(es6) 就是解决异步编程和回调地狱等问题,async和await的出现(ES8)就是基于promise的一种解决异步编程的终极解决方案(简化代码等等) 3.在前端中,ajax和axios都会用到异步编程,axios更是基于promise的,所以一定要掌握promise以及用async和await搭配promise的使用
本文链接地址:https://www.jiuchutong.com/zhishi/300674.html 转载请保留说明!

上一篇:3分钟让你学会axios在vue项目中的基本用法(建议收藏)(怎么才能学a1)

下一篇:【区块链实战】什么是 P2P 网络,区块链和 P2P 网络有什么关系(区块链教程大全)

  • 扬州黄码转绿码怎么申请(扬州黄码转绿需3日内2次阴性)

    扬州黄码转绿码怎么申请(扬州黄码转绿需3日内2次阴性)

  • 2017不变的营销规律(不断变化的营销战略带来了什么影响)

    2017不变的营销规律(不断变化的营销战略带来了什么影响)

  • 所有手机短信都不想接收怎么设置(所有短信都没了)

    所有手机短信都不想接收怎么设置(所有短信都没了)

  •  qq拒绝加好友并拉黑怎么解除(qq拒绝加好友并拉黑怎么判断)

    qq拒绝加好友并拉黑怎么解除(qq拒绝加好友并拉黑怎么判断)

  • 华为nova5i怎么分屏(华为nova5i怎么分两个屏幕应用)

    华为nova5i怎么分屏(华为nova5i怎么分两个屏幕应用)

  • 微信语音久了自动挂断(微信语音自动中断怎么回事)

    微信语音久了自动挂断(微信语音自动中断怎么回事)

  • wps邮件合并在哪里(wps 邮件合并在哪)

    wps邮件合并在哪里(wps 邮件合并在哪)

  • 小栈是什么意思(小栈的栈怎么写)

    小栈是什么意思(小栈的栈怎么写)

  • econavi是什么意思(econ什么意思)

    econavi是什么意思(econ什么意思)

  • 微信钱包删除记录为啥还要人脸认证(微信钱包删除记录还在吗)

    微信钱包删除记录为啥还要人脸认证(微信钱包删除记录还在吗)

  • 手机白边液是什么东西(手机白边液是什么油)

    手机白边液是什么东西(手机白边液是什么油)

  • 微信面容登录怎么设置(微信用面容解锁)

    微信面容登录怎么设置(微信用面容解锁)

  • 芒果pc会员和芒果tv会员一样吗(芒果pc会员和芒果会员)

    芒果pc会员和芒果tv会员一样吗(芒果pc会员和芒果会员)

  • 换手机内屏会丢失数据吗(换手机内屏会清空数据吗)

    换手机内屏会丢失数据吗(换手机内屏会清空数据吗)

  • 内存储器分为哪两大类(内存储器分为哪两种)

    内存储器分为哪两大类(内存储器分为哪两种)

  • 华为mate30支持双系统吗(华为mate30支持双微信吗)

    华为mate30支持双系统吗(华为mate30支持双微信吗)

  • ipad能插内存卡吗(ipad能插内存卡卡吗)

    ipad能插内存卡吗(ipad能插内存卡卡吗)

  • 金立s9怎样取消开机壁纸(金立手机怎么取消锁屏密码怎么设置)

    金立s9怎样取消开机壁纸(金立手机怎么取消锁屏密码怎么设置)

  • qq空间说说私密怎么解除(qq空间说说私密评论别人能看到吗)

    qq空间说说私密怎么解除(qq空间说说私密评论别人能看到吗)

  • 手机qq怎么设置彩色名字(手机qq怎么设置加好友权限)

    手机qq怎么设置彩色名字(手机qq怎么设置加好友权限)

  • 抖音左右镜像怎拍摄(抖音的左右镜像如何制作)

    抖音左右镜像怎拍摄(抖音的左右镜像如何制作)

  • vivox27怎么设置微信美颜(vivox27怎么设置返回键在桌面)

    vivox27怎么设置微信美颜(vivox27怎么设置返回键在桌面)

  • 钉钉文件怎么发到QQ(钉钉文件怎么发到qq邮箱)

    钉钉文件怎么发到QQ(钉钉文件怎么发到qq邮箱)

  • 7p电池容量多少毫安(7p的电池)

    7p电池容量多少毫安(7p的电池)

  • nova4怎么知道是高配(怎么区分买的华为nova4)

    nova4怎么知道是高配(怎么区分买的华为nova4)

  • airpods安卓手机能用吗(airpods安卓手机使用教程大全)

    airpods安卓手机能用吗(airpods安卓手机使用教程大全)

  • 微博照片水印设置苹果教程(微博 照片水印)

    微博照片水印设置苹果教程(微博 照片水印)

  • windows modules installer worker是什么? 可以删除吗?(windows modules installer worker怎么禁用)

    windows modules installer worker是什么? 可以删除吗?(windows modules installer worker怎么禁用)

  • ghost win10安装教程(ghost windows10安装教程)

    ghost win10安装教程(ghost windows10安装教程)

  • 专票抵扣进项税可以省钱吗
  • 环评费用怎么入账
  • 未开票收入次月如何申报增值税
  • 加计抵减的税额多长时间
  • 个人车卖给公司能抵税吗
  • 业务招待产生的快递费
  • 应收账款多记如何调账?
  • 合同没签定金可以退的吗
  • 小规模餐饮业会计核算
  • 发票已开款项未入账有什么影响?
  • 外购低值易耗品可以抵扣进项税额吗
  • 免抵税额计入什么科目
  • 目前建筑里面税金总共包括几部分
  • 建筑行业一般纳税人简易征收的范围
  • 钢结构安装有哪些工种
  • 入职不满一年有年假吗
  • 劳务派遣差额征税政策
  • 资产基金科目如何选择
  • 土地使用税每个月都要计提吗
  • 筹建期可以有收入吗
  • 定金转为货款金额需要特别约定吗?
  • 录入凭证时记账的依据是
  • 结算会计和核算会计哪个更好
  • 企业增资需要缴纳什么税
  • 笔记本怎么清理D盘
  • windows问题报告桌面一直闪
  • 2020快手怎么删除
  • bearshare.exe进程安全吗 bearshare是什么进程
  • 税收风险的含义
  • 企业购进商品取得的现金折扣
  • 股权变更怎么缴纳个人所得税
  • PHP:mcrypt_encrypt()的用法_Mcrypt函数
  • phpajax技术
  • 美国华盛顿山在哪里
  • 克扣拆迁款
  • 圣安德鲁斯市
  • lama羊驼
  • 孪生神经网络 计算相似度
  • php搜索代码
  • 退税勾选错了怎么办
  • python动态数据类型
  • 银行询证函快递费计入什么科目
  • 建筑设备租赁如何交税
  • 代收收款收据证明范本
  • 需要做审计有哪些行业
  • 建筑工程租赁费属于什么费用
  • 小规模纳税人都是3%吗
  • 购入固定资产入账会计凭证怎么做
  • mysql delete limit 使用方法详解
  • 个体工商营业执照注销需要缴费吗
  • 学历教育服务增值税
  • 增值税专用发票和普通发票的区别
  • 不良品怎么入账
  • 短期借款怎么做账务处理
  • 商业汇票的会计核算
  • 加油站汽油损耗分析
  • 进项税额转出多了怎么调整
  • 金蝶软件版本号有哪些
  • 佣金开什么发票内容?
  • 货物发出退货
  • 高新企业研发费用占比
  • 附条件的行政行为有哪些
  • 个人购汇需要申报吗
  • sql server2019还原数据库
  • MySQL timestamp的类型与时区实例详解
  • mysql5.7bug
  • mysql的慢查询日志怎么查看
  • linux i
  • Fedora Core 5.0 安装教程,菜鸟图文教程(linux text)
  • win8任务栏在底部不显示
  • 水模拟软件
  • perl -p -i
  • bootstrap弹出表单
  • node 进程
  • unity linux arm
  • 猫的喵喵
  • android开发前景
  • 天津河东区医院地址电话
  • 请问地税是省直单位吗
  • 注册税务师考试时间2024
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设