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

自学前端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年前11月国内大盘仍承压,头部手机厂商谋突围21世纪经济报道记者骆轶琪广州报道2022年对于手机行业来说无疑是高压之年,多场大促也难以让国内大盘稳固3亿台门槛。中国信通院统计显示,2022年111月,国内手机总体出货量累计2工业互联网园区指南(2。0版本)发布园区经济是改革开放以来中国经济发展的重要经验,不仅成为了中国经济的载体和平台,也成为区域经济增长的快速增长极。2022年2月,国务院印发十四五数字经济发展规划,提出要推动园区数字化专访浙江农商联合银行董事长王小龙小法人大平台模式可以兼顾防风险和支农支小21世纪经济报道记者杨志锦唐婧杭州报道如果允许县域法人合并,那么穷的县就倒霉,一定会被抽水。在改革化险过程中,农信社并不能简单一并了之。浙江农商联合银行董事长王小龙2022年12月直播带货的2022年,没有了头部主播最低价和神话随着春节将至,各大电商平台都已开启了相应的年货节活动。目前,李佳琦直播间也开始售卖各类年货,并开设了零食生活用品数码美妆等多个专场,但有用户反馈,李佳琦直播间的苹果产品价格并不香。红魔电竞机械键盘游戏鼠标上手体验电竞玩家的外设利器畅聊数码新品日前,红魔召开主题为全面进化,不止电竞的旗舰新品发布会,带来了红魔8PRO和红魔8PRO两款新旗舰。此外,红魔话宣布进军PC电竞外设领域,为我们带来了红魔电竞机械键盘,OpenSceneGraph纹理API指南前面的教程中,我们用彩虹的所有颜色画了一个正方形。然而,还有另一种成为纹理映射的技术,将光栅二维图像应用于三维几何。在这种情况下,效果不是针对几何体的顶点,而是通过栅格化场景更改获中国军团4胜4负,8人晋级正赛!丁俊晖轰40横扫,周跃龙惨败出局中国军团4胜4负,8人晋级正赛!丁俊晖轰40横扫,周跃龙惨败出局。2023年斯诺克威尔士公开赛资格赛已经结束了,最后一个比赛日共有8位中国选手出战,取得了4胜4负的战绩,丁俊晖,吴外媒看好中国经济前景领航全球复苏提振世界信心国际在线专稿岁末年初,中国不断释放助推经济发展的积极信号。多家外媒对此反应迅速,连续发文对中国经济前景做出积极预测,称在全球经济增长乏力的大背景下,中国经济复苏将脱颖而出,提振世界申领失业保险金有时间次数限制吗?参保缴费1年以上非因本人意愿中断就业的失业人员可向失业保险经办机构申领失业保险金失业保险金可以领多久?用人单位和本人累计缴费满1年不足5年的,领取失业保险金的期限最长为12个月累计iPhone电池保养这件小事也要花时间上课!有必要还是真矫情?文科技V力自从iOS11首次加入电池健康度功能后,苹果用户不时都会查询自己手机的电池健康度,也从而产生一系列的问题为什么才用几个月,我的iPhone电池健康度掉那么快?我的电池健康重庆喊你来过年看龙舞逛古城大展宏兔新铜梁人在火中舞龙在火中游过中国年当然少不了中华第一龙铜梁火龙看追梦铜梁龙舞动玄天湖到安居古城闹新春铜梁邀你龙乡过兔年大展宏兔!作为国家级非物质文化遗产,有着上千年历史的火龙一直是铜梁必
2023年春夏穿衣趋势离不开这3大元素正如电影春天的故事所刻画的那样,春天是一个暧昧的季节。阳春三月,一切都是悸动的样子。天气的冷与暖,万物的睡与醒,心情的好与坏,所有的一切都被温柔的搅动着,没有边界。电影春天的故事穿这几个变美小窍门,据说只有50的人能掌握,只要照做就能逆袭1。一般人不要穿小领口的T。领口越大越显得人脖颈修长。(我知道,暴露我是个对A了)2。买个宽齿的梳子,洗澡前细细地梳。洗完吹头发8成干,可以躺在床上,头悬挂在床沿上让8成干变成9成倡棋杯惊奇多人弃权预选不计等级分08林子杰挑落周睿羊延宕一年的第18届倡棋杯重新开打后,惊奇连连!一年前报名的参赛棋手,在网赛改为面棋后出现前所未见的大面积弃权,毕竟很多棋手无法预计一年后自己的行程安排,这是美中不足之处!解封后龙星腊梅香自苦寒来,逆风绽放凌霄花雪公主谷爱凌!前段时间,网传谷爱凌恋爱了。并被网友拍到在滑冰场与外国男子亲密接吻。两人还一起外出游玩过。正是因为这个外国男友的身份,谷爱凌在网络上被骂惨了,一些评论简直不忍直视。小编虽然不是谷爱最新进展!李梦希望和解!李月汝伤病恢复良好,被特邀设计专属logo?最新进展!李梦希望和解!李月汝伤病恢复良好,被特邀设计专属logo?3月18日,李梦插足前女篮领队张隆家庭充当小三,事件传得沸沸扬扬,并且李梦的名字还冲上了热搜榜首,事发后很多李梦96岁赢棋打破丈夫留下的世界纪录,她是如何做到的?文羊城晚报全媒体记者赵亮晨在近百岁的年纪依然伫立于职业赛场强手之林,是一种什么体验?日本女子围棋选手杉内寿子八段是世界最年长的现役围棋选手,刚度过96岁生日的她在最近举行的日本第4四川西昌千亩梨花次第开美丽乡村入画来来源人民网四川频道原创稿梨花竞相开放。文雅摄梨花竞相开放。文雅摄梨花竞相开放。文雅摄梨花竞相开放。文雅摄梨花竞相开放。文雅摄梨花竞相开放。文雅摄梨花竞相开放。文雅摄梨花竞相开放。文追求美丽和时尚?朝鲜女孩这么做在朝鲜人的审美观里,美女应该是大眼睛,高鼻梁,樱桃小嘴和白净的皮肤。身材不能太胖,也不能太瘦。和很多国家女孩一样,朝鲜女孩也追求美丽时尚。韩国女孩喜欢整容,朝鲜女孩整容吗?答案是肯会穿鞋的女人才优雅!今年穿裙搭这5双低跟鞋,洋气显高鞋子在整体穿搭中发挥着不容忽视的重要作用,选对款式不仅可以很好的满足增高需求,也能让整体穿搭的造型感和精致度更上一个台阶,洋气还显高。今年穿裙子流行用这5双低跟鞋来搭配,同时兼顾了大快人心!李铁大案引起蝴蝶效应,64岁大佬被逮捕,已经退休4年现在算算,自从李铁被抓已经过了挺长一段时间了!在这一段时间里,中国体坛可谓风声鹤唳,大事层出不穷。在诸多体育项目中,很多人相继被抓,原因无外乎一点贪腐。在足球圈,很多人都下狱了,有花琉璃轶闻花琉璃假装柔弱,被一眼识破,为何姬元溯还要配合她花琉璃轶闻正在热播,剧中的花家因打了胜仗,被满朝文官嫉妒,频频上书皇帝!昌隆帝迫于压力,为了平息流言,将花应庭的女儿册封为县主,将她接入玉京城生活。花家势头正旺,这个时候万不可以踏