当前滚动:js基础知识:Promise封装的Ajax7.async/await
文章目录
(资料图片)
1. 简单运用Promise2. Promise三个状态3. Promise链式调用4. Promise.all5. Promise.race6. Axios——Promise封装的Ajax7. async/await
1. 简单运用Promise
function sleep(time) {return new Promise(function(resolve, reject) {if(time < 1000) {setTimeout(resolve("You are success"), time); } else {reject("fail"); } })}sleep(500).then(msg => {console.log(msg);}).catch(err => {console.log(err);});
控制台查看结果:
一般在使用Promise的时候,会在定义的函数中返回一个Promise构造函数,该构造函数包含两个参数,分别是resolve和reject。在上面的代码中,我们调用sleep方法,传入500。而我们使用了Promise的内置方法then,并且向then中传两个参数,一个是成功回调函数,一个是失败回调函数(本例中省略第二个参数)。当承诺成功兑现,第一个回调就会被调用,而当出现错误的时候,就会调用第二个参数reject(此处省略)。由于500小于1000,因此会执行setTimeout(resolve(“You are success”), time),输出了You are success。 在上面的例子中,我们还使用了Promise中的catch方法,当传入的参数大于500,则会执行catch方法,catch方法中传递一个参数,也就是reject,因此在失败的时候会执行它。如下:
2. Promise三个状态
promise对象用于作为异步任务结果的占位符,代表着一个我们暂时还没获得但未来有希望获得的值。正是因为这个原因,js的工程师们为Promise设置了三种状态,分别是等待态(pending),接受态(fullfilled),失败态(rejected)。当resolve函数被调用,promise的状态就会变成接受态;反之,如果reject方法被调用,或者在promise调用过程中发生了一个未处理的异常,则会进入失败态。一旦状态改变一次,promise将不会再次改变状态。
3. Promise链式调用
在本文开头,我们提到了回调地狱,最为常见的就是使用Ajax时,由于多个相互关联的请求多层嵌套,造成语法臃肿,对于后续的维护产生了不好的影响。而promise的链式调用,一定程度上解决了这个问题。我们再回到代码:
sleep(500).then(msg => {console.log(msg);}).catch(err => {console.log(err);});
此处使用了then方法,当promise成功兑现,则触发回调函数。我们还会发现,除了打印出You are success之外,还返回了一个Promise对象。
这就是说,每次then()都会返回一个新的promise,而这一个promise则可以交给下一个then方法使用。如下所示,每次then方法之后都返回了sleep(),而我们给出的sleep方法就是返回一个promise实例化对象,这样不断交给下一个then方法执行,就是我们的链式调用。
sleep(500).then(msg => {console.log(msg);return sleep(500);}).then(msg => {console.log(msg);return sleep(500);}).then(msg => {console.log(msg);return sleep(500);}).then(msg => {console.log(msg);return sleep(1500);}).catch(err => {console.log(err);});
控制台输出:
4. Promise.all
Promise除了链式调用实现多个步骤相互依赖之外,还提供了同时等待多个异步任务的方法,这里使用Promise中的all。
Promise.all([ sleep(500), sleep(600), sleep(1500)]).then(result => {console.log(result);}).catch(err => {console.log(err);})
控制台输出如下:
在这个方法的使用中,我们不关系任务执行的顺序。使用的时候,我们传入一个数组,元素则是promise对象。当调用all的时候,会等待所有的promise对象被兑现之后,返回一个成功值数组。 但是,当其中一个promise失败,则会影响整个结果,如下所示:
5. Promise.race
当我们只关心第一个返回结果的promise时,Promise.race能帮你达成这个愿望。如同Promise.all一样,我们在使用race的时候会传入一个promise对象数组,,一旦该数组中的一个promise被兑现,则返回结果。为了印证这一点,我们改造一下sleep方法,如下:
function sleep(time) {return new Promise(function(resolve, reject) {if(time < 1000) {setTimeout(resolve(`${time}s later...`), time); } else {reject("fail"); } })}Promise.race([ sleep(500), sleep(600), sleep(700)]).then(result => {console.log(result);})
控制台输出如下:
6. Axios——Promise封装的Ajax
在前端开发中,异步向后端发起请求有很多中方法,jQuery的Ajax,fetch,以及axios。axios的官网(http://www.axios-js.com/zh-cn/docs/)上是这样介绍的。 和jQuery的Ajax功能相似,都是对XMLHttpRequest的封装,让我们能够更好地进行异步请求。在Axios官网中还提到:“使用Promise管理异步,告别传统callback方式”,这里说的就是Promise的链式调用。正是这种语法的使用,让回调地狱问题得到了很好的解决。axios本质上也是对原生XHR的封装,只不过它是Promise的实现版本。 Axios简单使用代码如下:
axios.get(url) .then(function (response) {console.log(response); }) .catch(function (error) {console.log(error); });
本质上Axios的实例化对象就是一个promise,因此当我们熟悉了promise之后再来使用axios会比较容易上手。 为了加深理解,这里使用Promise封装一个XMLHttpRequest,模拟axios。代码如下:
function getJSON (url) {return new Promise( (resolve, reject) => {var xhr = new XMLHttpRequest() xhr.open("GET", url, true) xhr.onreadystatechange = () => {if (this.readyState === 4) {if (this.status === 200) {resolve(this.responseText) } else {var resJson = {code: this.status, response: this.response } reject(resJson, this) } } } xhr.send() })}getJSON ("https://blog.csdn.net/").then(res => {console.log(res); }).catch(error => {console.error(error);});
非常遗憾,出现了跨域问题,但是没关系,主要是通过一个实际的例子让帮助大家更进一步理解promise。
7. async/await
不知道大家发现没有,Promise虽然一定程度上解决了回调地狱问题,但是链式调用的语法仍然不够优雅,我们如果能用完全同步的语法来解决异步问题,那该有多好。在ES6中,我们可以使用生成器和promise相结合的方式实现这个愿望。而JS伟大的工程师们为我们提出了更好的方案,async/await,这号称是JavaScript解决异步问题的终极解决方案,其实是对Promise的再一次封装,也可以说是语法糖。那么它到底如何,就请听下回分解吧!
标签:
相关推荐:
最新新闻:
- 当前热点-Linux系统如何架设石器私服?Linux系统架设石器私服教程
- 当前滚动:js基础知识:Promise封装的Ajax7.async/await
- ipad分屏怎么做?小白一键重装系统官网
- 【天天速看料】《福星小子》新作动画第二季宣布2024年开播 JK拉姆视觉图公开
- 《生化危机4:重制版》阿什莉脸模分享新发型庆祝游戏发售 短发造型超可爱_全球热点
- 《摩尔庄园》手游运营主体变更为淘米 玩家数据迁移3月底开放
- 世界新消息丨分析师盘点22年全球游戏厂商营收 腾讯250亿美元登顶
- 全球动态:续航稳了!荣耀Play7T手机定档3月28日
- 全球消息!32岁博扬宣布退役!梅西还没退“梅西接班人”退了
- 2020立春是几月几日_2020年立春是几月几号
- 《七龙珠 异战2》免费更新第16弹正式发布
- 内部人士透露 更多MCU作品或将延期上线
- 自信!制作商CEO预计《寂静岭2重制版》将卖千万份
- 《重装机犬》结束抢先体验 正式版今日上线_全球独家
- 万代《狂想乐园》宣布6月16日发售 预购正式开启
- 小说《狂飙》进高中语文试卷 考生:因为高启强 没写完作文:今日热议
- 美丽的西双版纳教案大班_美丽的西双版纳教案
- 云顶之弈S8.5源计划狼人阵容搭配,S8.5源计划狼人阵容装备攻略:环球时快讯
- 世界今日报丨动画电影《PHOENIX: EDEN17》特别影像公开 年内上线
- 天天观天下!泰国《天才枪手》将翻拍好莱坞英语版!漫威“老王”加盟
- 《莱莎3》M站评分82分:系列最佳 莱莎依旧美如画
- 天天即时看!《艾尔登法环》光追PC性能分析 配置很求很高
- 当前快看:世界钢铁协会:2月统计全球63个国家的粗钢产量为1.424亿吨 同比下降1.0%
- 新消息丨《LOL》新皮肤花仙子宣传片:白发卡特又美又飒!
- 未来游戏春季展:赛朋肉鸽《电弧跑者》发售日宣传片
- 全球聚焦:未来游戏春季展:科幻解谜《熵值中心》关卡编辑器更新预告
- 《不止不休》首批豆瓣评价出炉 主题沉重叙事平庸_今日热文
- 世界速递!百亿补贴!Apple iPhone 14史低价4949元
- 1599元起!iQOO Z7今日开售:120W快充加持
- 满帧畅玩 2023首届iGame G-ONE·永劫无间全民电竞精英赛火热招募中!
- 腾讯2022年人均年薪102.5万
- TCL超薄零嵌系列冰箱空降京东家电3月超级新品季,焕新家装新品质
- 世界热头条丨开放世界生存游戏《求生岛不老泉传说》4月19日开启抢先体验
- 在直面现实的奋斗中超越自我
- 热门:《生化危机4:重制版》发售太火爆 玩家直接把CDkey网站挤崩溃
- 《乐高2K竞速》Steam页面上线 售价199元_天天资讯
- 《以闪亮之名》今日公测!公测PV首曝 做理想生活的设计师-环球聚看点
- 桌面图标无法删除是怎么回事?桌面背景图片全部清除的方法是什么?
- 局域网怎么抢网速?局域网是什么意思?
- windows8文件夹怎么加密?win8文件夹加密并隐藏的方法
- 如何打开mdi文件?打开mdi文件的方法步骤
- 港服PS三档会员新增试玩:《索尼克:未知边境》
- stk文件是什么?stk文件怎么打开?
- 大光圈f值是什么意思?光圈都有哪些作用?
- DVD解码器如何安装?DVD解码器安装步骤介绍
- win7显示桌面快捷键是什么?显示桌面快捷键介绍
- DNF遗忘之地在哪里?DNF遗忘之地攻略分享
- 什么是HTTP ERROR 403?导致403错误的主要原因及解决方法
- dnf加速器是什么?dnf加速器功能介绍
- 无法将数值写入键是什么情况?无法将数值写入键的解决步骤
- 无法将数值写入键是什么情况?无法将数值写入键的解决步骤
- 打开浏览器无法显示网站提示502 bad gateway怎么办?浏览器无法显示网站解决方法
- 火炬之光2存档位置在哪?火炬之光2存档位置介绍
- 十字绣设计软件有什么用?十字绣设计软件如何破解使用?
- 即时看!超级折扣!5500板U套装仅799元
- Solidigm出席中国闪存市场峰会, 聚焦固态存储新范式,共绘行业发展新未来|全球快消息
- 130MB/s!256G双口USB3.1高速U盘99元 全球视点
- iPhone车祸检测功能下周将升级
- 16起车祸!苹果自动驾驶还早着呢|全球观察
- 金士顿u盘驱动程序遭遇故障怎么办?金士顿u盘驱动程序遭遇故障解决方法
- win7电脑怎么发传真?win7电脑发传真的具体方法
- 计算机丢失XINPUT1_3.DLL怎么解决?计算机丢失XINPUT1_3.DLL解决方法
- IE无法打开Internet站点怎么解决?IE无法打开Internet站点解决方法
- 台式机怎么用u盘重装系统?台式机重装系统的方法步骤
- 苹果手机如何使用通话录音?iPhone有通话录音功能吗?
- 每日观察!华发实业拟赎回9.3亿元中票 利率4.10%
- 《生化危机4:重制版》Steam特别好评:能击败自己的只有自己
- 《西之绝境》DLC发生在主线之后 需通关本体才能游玩_每日消息
- 《匹诺曹的谎言》亮相JustDan2023游戏节
- 【世界独家】AK蝾螈 肉鸽射击游戏哦《AK-xolotl》Steam页面上线
- 《愤怒的小鸟》开发商Rovio收购谈判告终 继续寻找其他买家_天天讯息
- 《暗黑破坏神4》公开Beta测试新预告 准备加入战斗!
- 天天快消息!生活模拟游戏《Go-Go Town!》Steam页面上线 支持简体中文
- 打开360浏览器为什么总是出来新标签页?原因分析及解决方案
- airtag是什么东西?airtag可以当定位器吗?
- dnf转区是什么意思?dnf申请转区的方法步骤
- 台式机电源功率计算方式是什么?750w电脑一小时几度电?
- 电脑网关地址怎么查询?查看网管地址需要怎么做?
- 我行我速如何修整图像?自动改善相片的步骤介绍
- Win10鼠标拖尾特效怎么关闭?Win10关闭鼠标拖尾特效的方法
- 泰捷视频电脑版怎么安装?泰捷视频电脑版使用方法
- 描述文件怎么安装? ios14描述文件的安装方法
- 遇到文件夹删不掉要怎么办?文件夹不能删除的解决方法
- aac是什么格式?aac文件怎么变成mp3?
- 如何彻底卸载微软拼音输入法?win10卸载微软拼音输入法方法