Promise相关知识

Promise
一、.定义
Promise是JS中进行异步编程的新的解决方案,是为了解决回调地狱而提出的。
二、为什么要用Promise?
①、指定回调函数的方式更加灵活
1). 旧的:必须在启动异步任务前指定
2). promise:启动异步任务 =>返回promise对象=> 给promise对象绑定回调函数(甚至可以在异步任务结束后指定多个)
②、支持链式调用,可以解决回调地狱问题
a. 回调地狱:回调函数嵌套调用,外部回调函数异步执行的结果是嵌套的回调执行的条件
b. 回调地狱缺点:不便于阅读,不便于异常处理
c. 回调地狱解决方案:promise链式调用
三、Promise实践
1.Promise实践之AJAX请求
在这里插入图片描述
2. Promise封装
Promise封装 一个mineReadFile函数,其中前两行解决了require is undefined的问题
在这里插入图片描述
3.util-promisify方法
虽然Promise已经普及,但是NodeJS里仍然有大量的依赖回调的异步函数,如果每个函数都封装一次,很麻烦,util-promisify(),方便我们快捷的把原理的异步回调方法改成返回Promise实例的方法,接下来使用队列,还是await就看需要了。
满足条件:最后一个参数是函数;回调函数的参数为(err,result),前面是可能的错误,后面是正常的结果。
在这里插入图片描述
4.Promise封装AJAX请求
在这里插入图片描述
5.Promise状态改变
这个状态是Promise实例对象之中的一个内置属性【PromiseState】,不能直接对这个属性进行操作。
这个状态共有三种可能的值:
pending 未决定的, resolved(fullfilled)成功 , rejected 失败
状态变换只存在两种可能:
①、pending变为 resolved
②、pending变为 rejected
说明:只有这两种,且一个Promise对象只能改变一次,无论变为成功还是失败,都会有一个结果数据,成功的结果数据一般称为value,失败的结果数据一般称为reason
6、Promise对象结果值属性
Promise对象中还有一个内置属性【PromiseResult】,它保存的是异步任务成功或者失败的结果。
对PromiseResult能做修改赋值操作的只有两个函数: resolve 、reject
7、Promise的基本工作流程
在这里插入图片描述
四、Promise API
1、Promise构造函数:Promise(executor){}
(1) executor函数:执行器(resolve,reject) =>{}
(2) resolve函数:内部定义成功时调用的函数value =>{}
(3) reject函数:内部定义失败时调用的函数 reason =>{}
说明:executor会在Promise内部立即同步调用(也就是一旦new Promise(),就会立即执行括号中的函数,然后再去执行new Promise()函数体之外后面的代码,这个函数不会进入到队列之中,会立即被执行),异步操作在执行器中执行。
2、Promise.prototype.then方法:(onResolved,onRejected)=>{}
(1) onResolved函数: 成功的回调函数 (value) =>{}
(2) onRejected函数:失败的回调函数 (reason) =>{}
说明:指定用于得到成功value的成功回调和用于得到失败reason的失败回调 ,返回一个新的promise 对象。
3、Promise.prototype.catch方法:(onRejected) =>{}
(1) onRejected 函数:失败的回调函数 (reason) =>{}
说明:只能指定失败的回调函数,是then的语法糖,相当于:then(undefined , onRejected)
4、Promise.resolve方法:(value) =>{} 它属于Promise函数对象,并不属于实例对象
(1) value :成功的数据或promise对象
说明:返回一个成功/失败的promise对象
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
5、Promise.reject方法:(reason) =>{}
(1) reason :失败的原因
说明:返回一个失败的promise对象
在这里插入图片描述
在这里插入图片描述
6、Promise.all方法:(promises) =>{}
(1) promises:包含n个promise的数组
说明:返回一个新的promise,只有所有的promise都成功才成功,只要有一个失败了就直接失败。成功的结果是每一个promise对象成功结果组成的数组,失败的结果是这个数组中失败的那个promise对象失败的结果。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
7、Promise.race()方法:(promises)=>{}
(1) promises: 包含n个promises 的数组
说明:返回一个新的promise,第一个完成的promise的结果状态就是最终的结果状态,哪一个第一个完成,那么它的状态就决定了race方法的返回结果,就像赛跑一样。
在这里插入图片描述
在这里插入图片描述
五、Promise关键问题
1、如何改变promise的状态?
(1) resolve(value) : 如果当前是pending就会变为resolved
(2) reject(reason): 如果当前是pending就会变为rejected
(3) 抛出异常:如果当前是pending就会变为rejected
2、一个Promise指定多个成功/失败回调函数,都会调用吗?
当promise改变为对应状态时都会调用,如果没有改变状态,那么状态一直是pending,就算是指定了回调函数,也不会执行。
在这里插入图片描述
先弹出alert弹框,点击确定之后控制台会输出’OK’
3、改变promise状态和指定回调函数谁先执行谁后执行?
(1) 都有可能,正常情况下是先指定回调再改变状态,但也可以先该状态再指定回调
(2) 如何先改状态再指定回调?
①、执行器中直接调用resolve()/reject()
②、延迟更长时间才调用then()
(3) 如何先指定回调再改变状态
在执行器中添加异步任务,比如添加一个延时器。异步任务进入队列,在异步回调中调用resolve,那么就是先指定回调,再改变状态
在这里插入图片描述
(4) 什么时候才能得到数据?(回调函数什么时候执行)
①、如果先指定的回调,那当状态发生改变时,回调函数就会调用,得到数据。
②、如果先改变的状态,那当指定回调时,回调函数就会调用,得到数据。
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) 办法:在回调函数中返回一个pending状态的promise 对象
在这里插入图片描述
六、async和await
1.async函数
①、函数的返回值为promise对象
②、promise对象的结果由async函数执行的返回值决定
(1)返回值是非Promise对象
在这里插入图片描述
输出的结果为
在这里插入图片描述
②、返回值是Promise对象
在这里插入图片描述
在这里插入图片描述
③、如果抛出异常
在这里插入图片描述
在这里插入图片描述
2.await表达式
①、await右侧的表达式一般为Promise对象,但也可以是其他值
②、如果表达式是promise对象,await返回的是promise成功的值
在这里插入图片描述
③、如果表达式是其他值,直接将此值作为await的返回值
在这里插入图片描述
在这里插入图片描述
3、注意
①、await必须写在async函数中,但async函数中可以没有await
②、如果await的promise失败了,就会抛出异常,需要通过try …catch捕获处理
promise的失败的状态
在这里插入图片描述
在这里插入图片描述
4.async和await的结合
async和await的结合,是不需要使用回调函数的,很简洁,但是它内部的执行是异步的
在这里插入图片描述
5、async和await结合发送AJAX
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值