Promise介绍与基本使用
理解
Promise是JS中进行异步编程的新解决方案(旧方案是单纯使用回调函数)
从语法上看,Promise是一个构造函数
从功能上看,Promise对象用来封装一个异步操作并可以获取其成功和失败的结果值
优点
指定回调函数的方式更加灵活
旧的:必须在启动异步任务前指定
promise:启动异步任务 => 返回promise对象 => 给promise对象绑定回调函数(甚至可以在异步任务结束后指定多个)
支持链式调用,可以解决回调地狱问题
回调地狱:回调函数嵌套调用,外部回调函数异步执行的结果说嵌套的回调执行的条件
回调地狱的缺点:不便于阅读,不便于异常处理
解决方案:promise链式调用
promise的状态
对象实例中的属性 PromiseState
pending 未决定的
resolved 成功
rejected 失败
对象实例中的属性 PromiseResult
保存着对象成功/失败的结果
resolve 成功的结果数据一般称为value
reject 失败的结果数据一般称为reason
工作流程
Promise API
1.Promise构造函数:Promise(executor){}
(1) executor函数:(resolve,reject)=>{} 执行器
(2) resolve函数:内部定义成功时调用的函数 value => {}
(3) reject函数:内部定义失败时调用的函数 reason => {}
说明:executor会在Promise内部立即同步调用,异步操作在执行器中执行
2.Promise.prototype.then 方法:(onResolved,onRejected)=>{}
(1)onResolved函数:成功的回调函数 (value) => {}
(2)onRejected函数:失败的回调函数 (reason) => {}
说明:resolve函数将成功的值通过参数传递给onResolved函数,reject函数将成功的值通过参数传递给onRejected函数,then会返回一个新的promise对象
3.Promise.prototype.catch 方法:(onRejected)=>{}
onRejected函数:失败的回调函数 (reason) => {}
4.Promise.resolve 方法:(value) => {}
value:数据或promise对象
说明:返回一个成功/失败的promise对象
value传入的值为非Promise类型的对象,则返回的结果为成功promise对象
PromiseState:fulfilled PromiseResult:value
value传入的参数为Promise对象,则参数的结果决定了resolve的结果
PromiseState:fulfilled PromiseResult:resolve的参数
PromiseState:rejected PromiseResult:rejected的参数
5.Promise.reject 方法:(reason) => {}
reason:失败的原因
说明:返回一个失败的promise对象
PromiseState:rejected PromiseResult:reason
6.Promise.all 方法:(promises) => {}
promises: 包含n个promise的数组
说明:返回一个新的promise,只有所有的promise都成功才成功,结果为所有的promise结果组成的数组,只要有一个失败了就失败,结果为第一个失败的promise的结果
6.Promise.race 方法:(promises) => {}
promises: 包含n个promise的数组
说明:返回一个新的promise,第一个完成的promise的结果状态就是最终的结果状态
Promise 关键问题
改变promise状态
1.调用resolve() pending => resolved
2.调用reject() pending => rejected
3.抛出错误throw string pending => rejected
一个promise指定多个成功/失败回调函数,当promise改变为对应状态时都会调用
改变promise状态和指定回调函数的先后顺序
(1)都有可能,正常情况下是先指定回调再改变状态(resolve()/reject()在异步任务执行后执行)
(2)先改状态再指定回调
在执行器中直接调用resolve()/reject()
延迟更长时间才调用then()
(3)什么时候得到数据
如果是先指定的回调,当状态发生改变时,回调函数就会调用,得到数据
如果先改变的状态,当指定回调时,回调函数就会调用,得到数据
promise.then()返回的新promise的结果状态由什么决定
简单表述:由then()指定的回调函数执行的结果决定
详细表述:
回调函数抛出错误
回调函数返回结果是非Promise类型的对象 无retuun则为defined
回调函数返回结果是Promise类型的对象
promise异常穿透
(1)当使用promise的then链式调用时,可以在最后指定失败的回调
(2)前面任何的操作出现了异常,都会传到最后的失败的回调中处理
中断promise链
(1)当使用promise的then链式调用时,在中间间断,不再调用后面的回调函数
(2)方法:在回调函数中返回一个pendding状态的promise对象
Promise 自定义封装
async 与 await
async函数
函数的返回值为promise对象
promise对象的结果值由async函数执行的返回值决定(和then的结果值相同)
await表达式
await右侧的表达式一般为promise对象,但也可以是其他值
如果表达式是promise对象,await返回的是promise成功的值
如果表达式是其他值,直接将此值作为await的返回值
注意
await必须写在async函数中,但async函数中可以没有await
如果await的promise失败了,就会抛出异常,需要通过try...catch捕获处理