Promise介绍
• 问题:
异步必须通过回调函数来返回结果,回调函数一多就很痛苦
• Promise
○ Promise可以帮助我们解决异步中的回调函数的问题
• Promise就是一个用来存储数据的容器
○ 它拥有一套特殊的的存取数据的方式
○ 这个方式使得它里边可以存储异步调用的结果
• 创建Promise
Promise的创建:
const promise = new Promise((resolve,reject) => {
resolve("哈哈")
//reject("哈哈")
})
console.log(promise)
• 创建Promise时,构造函数需要一个函数作为参数
• resolve 和 reject 是两个涵数,通过这两个函数可以向Promise中存储数据
• resolve在执行正常时存储数据,reject在执行错误时存储数据
• 通过函数来向Promise中添加数据,好处就是可以用来添加异步调用的数据
• 从Promise中读取数据
○ 可以通过Promise的实例方法then来读取Promise中存储数据
• Promise then方法读取数据:
const promise = new Promise((resolve,reject) => {
resolve("哈哈")
//reject("哈哈")
})
Promise.then((result) => {
console.log("1",result)
},(reason) => {
console.log("2",reason)
})
• then需要两个回调函数作为参数,回调函数用来获取Promise中的数据
○ 通过resolve存储的数据,会调用第一个函数的返回
○ 通过reject存储的数据或者出现异常时,会调用第二个函数返回
• 可以在第一个函数中编写处理数据的代码
• 可以在第二个函数中编写处理异常的代码
• Promise中维护了两个隐藏属性
○ PromiseResult
§ 用来存储数据
○ PromiseState
• 记录Promise的状态(三种状态)
1. pending (进行中)
2. fulfilled (完成)
3. rejected (拒绝,出错了)
• state只能修改一次,修改以后永远不会在变
• 流程:
○ 当Promise创建时,PromiseState初始值为pending
○ 当通过resolve存储数据时
§ PromiseResult 变为存储的数据 PromiseState 变为 fulfilled (完成)
○ 当通过reject存储数据时 PromiseState 变为 rejected (拒绝,出错了)
§ PromiseResult 变为存储的数据或 异常对象
• 当我们通过then读取数据时,相当于Promise设置了回调函数
○ 如果PromiseState变为fulfilled, 则调用then的第一个回调函数来返回
○ 如果PromiseState变为
rejected,则调用then的第二个回调函数来返回
• Promise的catch方法使用:
const promise = new Promise((resolve,reject) => {
resolve("哈哈")
//reject("哈哈")
})
promise.catch(reason => {
console.log(22222)
})
• catch() 用法和then类似,但是只需要一个回调函数作为
参数
○ catch() 中的回调函数只会在Promise被拒绝才会调用
○ catch() 相当于then(null, reason =>{})
○ catch() 就是一个专门处理异常的方法
• Promise方法finally的使用:
const promise = new Promise((resolve,reject) => {
resolve("哈哈")
//reject("哈哈")
})
Promise.finally(reason => {
console.log("没有什么能阻止我执行)
})
• finally()
○ 无论是正常存储数据还是出现异常了,finally总会执行
○ 但是finally的回调函数中不会接收到数据
○ finally()通常用来编写一些无论成功与否都要执行的代码