今天是被隔离的第72天,希望早点解封,我想回学校了,想吃麻辣烫炸串喝果汁吃橘子呜呜呜
Promise函数的学习
问题
如果我们用同步代码,获取数据用return当然是最省事的,但是当我们用异步代码时,则需要借助回调函数帮助我们获取数据,但是当我们进行一些复杂的调试时,会出现“回调地狱”,回调函数一多就会很痛苦,很难去调试的,可读性也很差,怎么办?
解决
Promise很空出世!
Promise概念
Promise是一个可以用来存储数据的容器,而Promise存储数据的方式比较特殊,这种特殊方式使得Promise可以用来存储异步调用的数据
创建Promise
创建Promise时,构造函数中需要一个函数作为参数(构造函数里穿一个函数,传function和箭头函数都行)
const promise = new Promise((resolve,reject) => {
console.log("果叽的回调函数执行了~")
})
console.log(promise)
Promise构造函数的回调函数,会在创建Promise时调用,调用时会有两个参数传递进去(resolve, reject)
- resolve 和 reject 是两个回调函数作为promise的参数,通过这两个函数可以向promise中存储数据
- 通过函数来向Promise中添加数据,好处就是可以用来添加异步调用的数据
- resolve 在执行正常时存储数据
- reject 在执行错误时存储数据
const promise2 = new Promise((resolve,reject) => {
//reject("我是reject") - 普通数据代码
setTimeout(() => { //异步数据代码,此时只要能调resolve就能向promise里存数据
resolve("哈哈")
},2000) // - 两秒以后把“哈哈”存到promise里+ 而console.log(promise)是立即执行
})
setTimeout(() => { // - 这样子,console.log 就不是立即执行了
console.log(promise2)
},3000)
从Promise中读取数据
1、可以通过Promise的实例方法then来读取Promise中存储的数据
2、then需要两个回调函数作为参数,回调函数用来获取Promise中的数据
- 通过resolve存储的数据,会调用第一个result函数返回
-
- 可以在第一个函数result中编写处理数据代码
- 通过reject存储的数据或异常时,会调用第二个reason函数返回
-
- 可以在第二个函数reason中编写处理异常代码
Promise中维护了两个隐藏属性
Promise中维护了两个隐藏属性:
PromiseResult
- 用来存储数据
PromiseState
- 记录Promise的状态(三种状态)
- pending(进行中)
- fulfilled(完成) 通过resolve存储数据时
- rejected (拒绝,出错了) 通过reject存储数据时,或出错了
- State智能修改一次,修改以后永远不会再变 (最初状态都是pending)
执行流程
执行流程:
当Promise创建时,Promise State初始值为pending
当通过resolve存储数据时,PromiseState 变为fulfilled(完成)
PromiseResult 变为存储的数据(最后传参传的是什么,PromiseResult就是什么)
当通过reject存储数据时 或出错时,PromiseState 变为rejected(拒绝,出错了)
PromiseResult 变为存储的数据 或 异常对象
当我们通过then读取数据时,相当于为Promise设置了两个回调函数
如果PromiseState变为fulfilled,则调用then的第一个回调函数来返回数据
如果PromiseState变为rejected,则调用then的第二个回调函数来返回数据
代码范例
//范例
const promise = new Promise( (resolve, reject)=>{
setTimeout( () =>{
// throw new Error("哦吼吼,出错惹") //故意向外部抛出了一个异常
resolve("我是resolve的返回数据")
reject("我是resolve的返回数据")
},1000)
})
promise.then(result =>{
console.log("1",result)
},(reason) =>{
console.log("2",reason)
})
resolve 和 reject 存数据 promise创建的
result 和 reason 取数据 我们自己创建的
catch() 方法
catch() 用法和then类似,但是只需要一个回调函数作为参数
\quad
catch() 中的回调函数只会在Promise被拒绝时才调用
\quad
catch() 相当于 then(null,reason => {})
\quad
catch() 就是一个专门处理Promise异常的方法
//catch()
const promise4 = new Promise( (resolve,reject) =>{
setTimeout( () => {
reject("la444")
},1000)
})
promise4.catch(reason => {
console.log(444)
})
finally()方法
1、无论是正常还是出现异常,finally总会执行。
2、 但是finally的回调函数中不会接收到数据。
3、finally() 通常用于编写一些无论成功与否都要执行的代码。
//finally()
const promise5 = new Promise( (resolve,reject) =>{
setTimeout( () => {
reject("la555")
resolve("haha555")
},1000)
})
promise5.finally(()=>{
console.log("没有啥是能阻挡我执行的555")
})
今天我吃到了一个苹果!!!是时隔2个半月以来吃到的第一个苹果!苹果好好吃呜呜呜😭