稀土掘金 稀土掘金

Promise简述与用法

引子

本文讲述了 Promise 的用法与方法介绍,详细解剖 Promise 的状态流程以及 Promise 关键问题

什么是Promise

Promise是JS中进行异步编程的新的解决方案

  • promise 是一个构造函数
  • Promise 的构造函数接收一个函数为参数,并且传入两个参数:resolve,reject,分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数。

为什么要用Promise

  1. 指定回调函数的方法更加灵活
  2. 支持链式调用 ,可以解决回调函数问题

Promise 的状态改变

说明: 只有这 2 种, 且一个 promise 对象只能改变一次

pending -->  resolved  `[成功后调用]`
pending -->  rejected  `[失败后调用]`

无论变为成功还是失败, 都会且只有一个结果数据

成功的结果数据一般称为value(val), 失败的结果数据一般称为 reason(res)

状态流程图

Snipaste_2021-09-27_14-59-26.png

Promise 方法

基础定义

Promise 构造函数: Promise (excutor) {}

excutor 函数: 同步执行 (resolve, reject) => {}

resolve 函数: 内部定义成功时我们调用的函数 value => {}

reject 函数: 内部定义失败时我们调用的函数 reason => {}

说明: excutor 会在 Promise 内部立即同步回调,异步操作在执行器中执行

Promise.prototype.then 方法:

说明:.then() 方法用来预先指定成功和失败的回调函数,调用 .then() 方法时,成功的回调函数是必选的,失败的回调函数是可选的

返回一个新的 promise 对象

` Promise.prototype.then(onResolved, onRejected) => {}`
onResolved 函数: 成功的回调函数 (value) => {} 
onRejected 函数: 失败的回调函数 (reason) => {} 

Promise.prototype.catch 方法:

说明:.catch() 方法用来捕获与处理错误 ,相当于 then(undefined, onRejected);

返回一个 失败 的 promise 对象

`Promise.prototype.catch(onRejected) => {} `
onRejected 函数: 失败的回调函数 (reason) => {} 

Promise.resolve 方法:

说明:返回一个 成功/失败 的 promise 对象

`Promise.resolve(value) => {}` 
value: 成功的数据或 promise 对象

Promise.reject 方法:

说明:返回一个 失败 的 promise 对象

`Promise.reject(reason) => {} `
reason: 失败的原因  

Promise.all 方法:

说明:只有所有的 promise 都成功才成功, 只要有一个失败了就直接失败;

返回一个新的 promise(成功的时候返回的是一个结果数组,而失败的时候则返回最先被reject失败状态的值)

`Promise.all(promises) => {} `
promises: 包含 n 个 promise 的数组 

Promise.race 方法:

说明:第一个完成的 promise 就是最终的结果状态;返回一个新的 promise

`Promise.race(promises) => {} `
promises: 包含 n 个 promise 的数组 

Promise关键问题

1. 如何改变 promise 的状态?

  1. resolve(value): 如果当前是 pendding 就会变为 resolved

  2. reject(reason): 如果当前是 pendding 就会变为 rejected

  3. 抛出异常: 如果当前是 pendding 就会变为 rejected

2. 一个 promise 指定多个成功/失败回调函数, 都会调用吗?

当 promise 改变为对应状态时都会调用

3. 改变 promise 状态和指定回调函数谁先谁后?

  1. 都有可能, 正常情况下是先指定回调再改变状态, 但也可以先改状态再指定回调

  2. 如何先改状态再指定回调?

  • 在执行器中直接调用 resolve()/reject()
  • 延迟更长时间才调用 then()
  1. 什么时候才能得到数据?
  • 如果先指定的回调, 那当状态发生改变时, 回调函数就会调用, 得到数据
  • 如果先改变的状态, 那当指定回调时, 回调函数就会调用, 得到数据

4. promise.then() 返回的新 promise 的结果状态由什么决定?

  1. 简单表达: 由 then()指定的回调函数执行的结果决定

  2. 详细表达:

  • 如果抛出异常, 新 promise 变为 rejected, reason 为抛出的异常

  • 如果返回的是非 promise 的任意值, 新 promise 变为 resolved, value 为返回的值

  • 如果返回的是另一个新 promise, 此 promise 的结果就会成为新 promise 的结果

5. promise 如何串连多个操作任务?

  1. promise 的 then()返回一个新的 promise, 可以开成 then()的链式调用

  2. 通过 then 的链式调用串连多个同步/异步任务

6. promise 异常传透?

  1. 当使用 promise 的 then 链式调用时, 可以在最后指定失败的回调,

  2. 前面任何操作出了异常, 都会传到最后失败的回调中处理

7. 中断 promise 链?

  1. 当使用 promise 的 then 链式调用时, 在中间中断, 不再调用后面的回调函数

  2. 办法: 在回调函数中返回一个 pendding 状态的 promise 对象

总结

  • Promise是JS中进行异步编程的新的解决方案
  • new 出来的 Promise 实例对象,代表一个 异步操作
  • 每一次 new Promise() 构造函数得到的实例对象,都可以通过原型链的方法访问到.then方法
  • 一个 promise 对象只能改变一次 ,一般为 padding 转为 resolved 或 padding 转为 rejected

玻璃钢生产厂家深圳玻璃钢卡通熊猫雕塑定制费用昆明市玻璃钢雕塑设计生产商景观玻璃钢人物雕塑加工四川常见商场美陈售价南京佛山玻璃钢动物雕塑扬州主题商场美陈许昌室外校园玻璃钢景观雕塑淄博公园玻璃钢雕塑制作汪汪队玻璃钢雕塑商场美陈消防检查平罗玻璃钢雕塑加工伊犁气球商场美陈装饰费用情况桂林市玻璃钢雕塑原平玻璃钢雕塑商场美陈的材质有哪些滁州人物卡通玻璃钢雕塑伊春广场玻璃钢雕塑厂家广东玻璃钢创意雕塑公司商业街玻璃钢雕塑设计厂家公园摆件玻璃钢卡通雕塑销售厂商场春节主题美陈玻璃钢玄关雕塑舟山创意玻璃钢雕塑优势武汉景观灯玻璃钢花盆美陈玻璃钢卡通雕塑生产淮南玻璃钢卡通雕塑规格金昌人物玻璃钢雕塑价格湖北水果玻璃钢雕塑生产厂家专业的户外玻璃钢雕塑玻璃钢公仔雕塑设计价格香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化