范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

自学前端Promise的理解和应用,好程序员分享Promise模式实现

  一、Promise小白怎么用?从一个故事开始吧1、先来一段废话故事
  您是一名在古老迷失城市中探险的冒险家。您身处一间装饰华丽的房间中,四周布满了古老的壁画和雕塑。您发现有两个通道分别通向不同的方向,分别是:一个黑暗的通道和一个明亮的通道。
  黑暗的通道中充满了神秘的气息,您能感受到其中蕴含的古老力量。您并不知道它会带您去哪里,但您可以感受到其中蕴藏的危险和未知。另一方面,明亮的通道看起来温暖舒适,您可以看到远处照耀的阳光。您能听到一些欢快的音乐声,似乎在那个方向上有一些人在欢庆。
  现在,您需要在这两个通道之间做出选择。您会选择哪一个通道呢?您的选择将会影响您接下来的冒险之旅。 2、再来看一段神秘的小短片
  https://drive.weixin.qq.com/s?k=AOoAUwfiAAwVgJbsSaAUEA_QbjAFk
  3、这么久了还不进入正题
  先来了解几个单词,几个Promise的术语
  Promise的三个状态:pending(等待状态)、fulfilled(已成功状态)和 rejected(已失败状态)
  Promise的三个常用回调函数(咱说的是常用):
  1.  实例化对象时传入的回调函数
  2.  then方法的传入的两个回调函数
  3.  catch方法传入的一个回调函数
  以作业为例,继续深入了解Promise
  1、开始写作业,此时Promise状态为pending,我们可以理解为初始状态,也可以理解为业务处理中
  2、作业完成情况有两种,一种是写完了,一种是被狗吃了
  3、无论哪种情况,必须要告诉老师,成功了就通过resolve通道暂存数据,同时会更改状态为成功fulfilled;失败了就通过reject通道暂存数据,同时修改状态为rejected。
  4、老师如何获取resolve或reject通道传来的数据呢?可以使用Promise对象的.then方法获取resolve或reject的结果,或者使用.catch方法获取reject通道的信息。
  5、简单来一段代码看看
  const p = new Promise(function (resolve, reject) {   resolve("通过成功通道存储数据") })  //...如果不使用then,提取,则数据一直暂存在p对象中  //提取结果 p.then(function (val) {   console.log(val) })
  6、这些写法都是固定的, 建议使用promise之前一定要充分了解回调函数
  7、咱们再升级一下,写作业用了5秒钟
  const p1 = new Promise(function (resolve, reject) {   //写作业用了5秒钟,5秒钟之后,把成功的作业暂存到resolve通道中   setTimeout(() => {     resolve("这是作业")   }, 5000) }) //上面代码中调用了resolve的时候,then里面的回调函数才会触发,这里有个时间差或者时空差的感觉 p1.then(function (val) {   console.log(val) })
  8、再升级一下,这作业他也有被狗吃了的时候,我们假定5秒钟之外就被狗吃了,5秒钟之内就是完成的
  const p2 = new Promise(function (resolve, reject) {   //生成一个1~6秒之间的随机数   const time = Math.random() * 4000 + 2000   setTimeout(() => {     if (time <= 5000) {       resolve("成功交作业啦")     } else {       reject(`作业被狗吃了,耗费了${time秒}`)     }   }, time) }) //成功使用then来接,失败了怎么拿到参数呢? //用then的第二个参数来拿失败的参数 p2.then(function (val) {   console.log(val) }, function (err) {   console.log("估计是被狗吃了", err) })
  9、除了then的第二个参数可以拿到失败的结果,还可以通过catch方法拿到结果,一会再讨论这两种用法的区别,先看catch的用法,注意这里需要连用
  p2.then(function (val) {   console.log(val) }).catch((reason) => {   //输出失败原因,大概率是被狗吃了   console.log("估计是被狗吃了", reason) })
  10、再看一种常用的连用的写法
  new Promise(function (resolve, reject) {   //生成一个1~6秒之间的随机数   const time = Math.random() * 4000 + 2000   setTimeout(() => {     if (time <= 5000) {       resolve("成功交作业啦")     } else {       reject(`作业被狗吃了,耗费了${time}秒`)     }   }, time) }).then(function (val) {   console.log(val) }).catch((reason) => {   //输出失败原因,大概率是被狗吃了   console.log("估计是被狗吃了", reason) })
  11、一些需注意的地方
  1.  resolve和reject只是一个形参的名字,对应实际的值是promise内部的函数,调用这两个其实调用的就是promise内部的某个函数而已,这个名字可以随便去改,例如
  new Promise(function (ok, fail) {   //此时此刻形参叫ok,但实际代表的是promise内部函数   ok("ojbk") }).then((res) => {   //promise内部会存储数据,传给res这个变量,此时res 值就是ojbk   console.log(res) })
  2.  new Promise(构造器的参数是一个函数),这个函数会同步执行,代码执行到这里的时候就会立即执行
  12、小结
  1.  Promise通过构造函数同步执行,执行结果调用promise的内部函数存储,通常叫resolve和reject,一个是成功时存储存储使用的通道,另一个是失败时存储的通道,无论存储到哪个通道中,都是写代码的人去定义的
  2.  then有两个参数,分别是两个函数类型的参数,第一个参数是在调用resolve时会触发,第二个参数是在调用reject时触发
  3.  catch方法可以替代then的第二个参数,拿到reject结果
  13、附赠then第二个参数和catch的区别
  在then的第一个参数里面的代码,如果出现异常的时候,不用手动的try...catch,通过promise实例对象的.catch可以捕获then内出现的异常,但注意,catch不会捕获构造函数代码中的错误,来看例子
  new Promise(function (ok, fail) {   setTimeout(() => {     //故意5秒后触发k的报错     console.log(k)   }, 5000) }).then((res) => {   console.log(res) }).catch(error => {   //这个时候,error是拿不到那个错误的,他不负责console.log(k)所在代码块中出现的错误   console.log(error) })
  再看一个catch方法能捕获什么地方的错误
  大概就是这么个大概 二、为什么要这么用,图个啥~
  使用 Promise 的主要原因是他可以解决回调地狱(回调嵌套)问题,让代码变得更优雅,逻辑更清晰
  举一个生活中的例子,早上起床第一件事是要穿拖鞋,第二件事是洗漱,第三件事是穿衣服,第四件事是查看"身手要钱",第五件事是打开自家房门出去开车上班,每件事都需要串行,每一步与下一步都有关联关系
  function foo() {   //1、穿拖鞋开始   setTimeout(() => {     //1、2秒后穿拖鞋完成     //2、洗漱开始     setTimeout(() => {       //2、2秒后洗漱完成       //3、穿衣服开始       setTimeout(()=>{         //3、穿衣服完成         //....不好意思看官,后边还有好几个步骤咱就意思一下,再写就吐了       },2)     }, 2)   }, 2) } foo()
  就写这几层吧,是不是太恶心了
  new Promise((resolve, reject) => {   //1、穿拖鞋   setTimeout(() => {     resolve("穿拖鞋搞定")   }, 2000) }).then(val => {   //等待穿拖鞋完成后,会调用这个函数   //2、洗漱   //注意此处!!!,必须使用return 返回一个新的promise来完成链式调用   const p = new Promise((resolve, reject) => {     setTimeout(() => {       resolve("洗漱搞定")     }, 2000)   })   return p }).then(val => {   //3、穿衣服,此处直接返回,没有使用中间变量   return new Promise((resolve, reject) => {     setTimeout(() => {       resolve("穿衣服搞定")     }, 2000)   }) }).then(val => {   //4、查看"身手要钱"   return new Promise((resolve, reject) => {     setTimeout(() => {       resolve("查看"身手要钱"搞定")     }, 2000)   }) }).then(val => {   //5、开车去上班   // 元气满满的一天 })
  就图这~
  三、Promise其他方法
  那么多方法,不讲那么多,race、all什么的网上一抓一大把 说说语法糖await和async的用法
  先了解一个基础规则
  await必须修饰的是Promise对象
  await必须在async中使用
  await只能接收resolve通道的结果,reject结果会导致报错
  await修饰的代码在执行时,代码是卡住的,类似于alert,这句代码不执行完,后边的代码不会向下执行,这也类似于线程同步执行的概念,这也是await有用之处
  async修饰的必须是函数
  async修饰后的函数在执行之后会转为Promise对象
  看一段简单的代码
  async function foo() {   let k = await new Promise(function (resolve, reject) {     setTimeout(() => {       resolve("qfedu")     }, 2000)   })   console.log(k) }  foo()
  这样用倒是更麻烦,我们把要处理的事黏黏糊糊多弄一些试一试
  async function foo() {   let level1 = await new Promise((resolve, reject) => {     //1、穿拖鞋     setTimeout(() => {       resolve("穿拖鞋搞定")     }, 1000)   })   //拿着第一步的结果,去第二步进行操作    let level2 = await new Promise((resolve, reject) => {     setTimeout(() => {       resolve(level1 + "洗漱搞定")     }, 1000)   })    let level3 = await new Promise((resolve, reject) => {     setTimeout(() => {       resolve(level2 + "穿衣服搞定")     }, 1000)   })    let level4 = await new Promise((resolve, reject) => {     setTimeout(() => {       resolve(level3 + "查看"身手要钱"搞定")     }, 1000)   })    console.log(level4 + ",之后开车去上班,元气满满的一天") }  foo()
  输出结果:
  这样代码看起来更加简洁,当然要重点考虑的问题是在整个从上到下的调用过程中,任何一个环节出现问题,都会影响下面的代码
  再来,我们把代码聚焦到foo()方法调用之前和调用之后
  console.log(1) foo()  //这个会输出 穿拖鞋搞定洗漱搞定穿衣服搞定查看"身手要钱"搞定......等 console.log(2)
  思考一下,程序输出的顺序
  注意,使用async包裹的代码,属于异步代码 ,会在同步代码之后执行
  我们给按钮添加一个点击事件,看点击按钮如何让程序使用await顺序执行
  async function foo() {   let level1 = await new Promise((resolve, reject) => {     //1、穿拖鞋     setTimeout(() => {       resolve("穿拖鞋搞定")     }, 1000)   })   //拿着第一步的结果,去第二步进行操作    let level2 = await new Promise((resolve, reject) => {     setTimeout(() => {       resolve(level1 + "洗漱搞定")     }, 1000)   })    let level3 = await new Promise((resolve, reject) => {     setTimeout(() => {       resolve(level2 + "穿衣服搞定")     }, 1000)   })    let level4 = await new Promise((resolve, reject) => {     setTimeout(() => {       resolve(level3 + "查看"身手要钱"搞定")     }, 1000)   })    console.log(level4 + ",之后开车去qfedu上班,元气满满的一天") }  window.onclick = foo; //或者是 window.onclick = async function(){   //todo ...   //await new Promise...   //await new Promise...   //await new Promise...   //... }
  实际场景中,await 与async通常用来处理ajax请求类代码,让代码更简洁,再次强调,await只接收resolve结果,注意reject和error的错误要使用try...catch...处理异常。
  今日的好程序员的分享就到这里,想了解更多,欢迎评论区探讨,或者dd小源~

不能因为产科遇冷就一关了之新京报快评2022年5月10日清晨,产科医生给新生儿称体重。图新华社春节过后,医院各科室的手术量和门诊量都逐渐回升甚至激增,但上升的暖风,并未吹进产科。不仅如此,有报道称,全国各地的产科一同冠豸山,正义之山沈子友(心系远山)冠豸山名山之旅(99)冠豸(zhai)山,地处闽西连城县之东1。5公里处,海拔661米,因主峰形似一顶古代法官戴的獬豸冠而得名。其山势平地兀立,不连岗自高,不拖势北流李花竞放迎客来广西春天的脚步春风送暖百花开,李花怒放一树白。初春时节,暖风和煦,北流市北流镇龙安水库的李花竞相开放,满树洁白的李花如雪如玉,带来了春天的气息,也吸引了不少游客前来赏花踏春。记者在舒服惬意的北海6日游美好的早上粗发从成都出发南宁一个半小时左右下了飞机坐大巴去动车站站到北海长途漫漫下了动车打了个出租车(价格差距大可以用滴滴,要划算些)终于到了我的海热到爆炸的感觉。烈日炎炎到达了酒今天,来万婴幼儿园晒春日暖阳Hello,spring!一年四季春为首。风轻轻柔柔,在阳光和树影间穿梭,一株小草一朵野花轻轻摇摆,都在温柔地向我们微笑。今天的暖阳跟新学期一样都藏着美好和惊喜。快,紧跟春天的镜头秦安县第二幼儿园组织开展思维导图教师培训为提升教师专业素养和教研水平,2月15日,秦安县第二幼儿园党支部组织全体教师开展思维导图培训活动。培训主要围绕手机版钉钉脑图电脑版钉钉脑图和实际操作案例三方面内容进行。培训过程中,延时更延爱,这两所幼儿园联合开办爱心晚困班钱江晚报小时新闻通讯员张骏萍郑佳梅孩子放学早家长下班晚,家里没大人帮忙照看孩子如何缓解孩子放学怎么办的困境?近日,杭州百合花幼儿园和九欣幼儿园联合开办的爱心晚困班开班,切实为家长解速看女人为什么要喜欢穿丝袜!丝袜的文化历史悠久,在今天的世界仍然有极大的影响力。丝绸和丝袜以其细腻柔软的质地,可以提供舒适的触感,令人惊叹。从美国的丝袜厂家的调研中可以明显看出,他们表明今天的女性仍然喜欢穿丝裙子下面别再配打底裤了,2023年流行这穿时髦洋气,还有女人味每年的春季档中,裙装单品的问世绝对是NO。1的经典而存在的,但在今年的时尚当中各位女性的裙子下就不要选择打底裤进行搭配了哦,2023年的时尚穿搭是这样展现出来的,去掉打底裤的搭配真必看!springboot整合shiro实现权限管理实战项目ApacheShiro是一个强大且易用的Java安全框架,执行身份验证授权密码和会话管理。使用Shiro的易于理解的API,您可以快速轻松地获得任何应用程序,从最小的移动应用程序到Java程序员的用户态内核态笔记一。前言想起很多年前被问到了用户态和内核态的相关问题,当时一知半解,但是工作这么些年,也极少听到这个概念,直到最近碰到后,终于决定以Java的角度,真正的了解一下这2个状态的实际作
重回1999元!曲面屏和4500mAh,超轻薄5G女性手机清仓了说到1999元,米粉们应该非常熟悉吧,小米从1到5代,发布的价格都是1999元,而且每次发布都非常轰动,受到消费者们的一致好评,但从小米6就开始涨价了,因为物价也一直在涨。现如今已高血压不能喝浓茶?医生提示想稳定血压,建议少喝3种水高血压是很常见的一种高发慢性疾病,一般发生在中老年人群中,近年来,逐渐呈现年轻群当中,和日常的作息和饮食不规律有很大的关系。如果不加以控制,会导致多种心脑血管问题出现,危害健康,所世界十大暴利行业,成本竟然如此之低?要说世界十大暴利行业,很多人首先想到的会是化妆品。没错,化妆品确实是暴利,并且还是世界十大暴利行业之首。化妆品售价几百上千的产品,其制造成本也就几十元!这十大暴利行业的成本低到你无月球上哪来的透明玻璃球?中山大学肖智勇博士领衔的研究团队,在ScienceBulletin2022年第4期发表了题为TranslucentglassglobulesontheMoon的ShortCommu微软着眼于蓬勃发展的游戏行业,计划收购动视暴雪微软和动视暴雪的合并预计明年敲定微软着眼于蓬勃发展的游戏行业,计划收购动视暴雪旧金山微软公布了其收购美国视频游戏巨头动视暴雪的大手笔计划,这是游戏行业创纪录的收购。预计将于明年完成2022北京冬奥会纺织科技盘点科技重塑纺织服装行业的规则和定位2022年北京冬奥会期间,科技和服装的融合更加明显,健儿们在冰雪中旋转飞跃,身上的高科技战袍更是提供了全方位防护。科技创新对服装行业的影响已经愈来愈深,从设计到功能体验,科技正在重中德友好不可能了?德国新政府对华最新政策出炉,有3点值得重视自从默克尔上任成为德国领导人后,中国和德国的贸易往来愈发密切,中德贸易接连5年取得优异成绩。而默克尔的卸任,让朔尔茨成为了德国新总理,他领导下的对华政策,有三点值得关注,或将对未来下游需求有望爆发式发展非制冷红外热成像仪值得关注红外产业链概述红外线是太阳光线中众多不可见光线中的一种,又称红外光红外热辐射,是波长介乎微波与可见光之间的电磁波,波长在0。76至1000微米之间。温度高于绝对零度(273)的任何中国股市2022年有望翻倍的五大基建行业机构重仓股,重点关注央妈防水地方接力,近期基建领域利好不断,测算规模达上百亿的新增项目,将会让沉积近3年的基建领域,个股带向,何方基建能否接力新能源成为2022年的A股主线,下面我们做一个分析。我们知国羽历史最差签运!两人解体又合体,教练究竟意图何在?2022赛季世界羽毛球全英公开赛即将打响,中国队也公布了参赛名单。里约奥运会男单冠军谌龙由于伤病原因缺席,东京奥运会女单冠军陈雨菲世锦赛女双冠军陈清晨和贾一凡等领衔出战。最让球迷费Shams哈登想离开篮网这让交易比预期提前很多直播吧2月24日讯名记Shams在节目中回顾了哈登与本西交易互换一事。两支球队都得到了他们想要的,76人整个赛季都想得到哈登,这也是他们的计划,事实上交易前几周我就报道过,76人会