在线学习Node.js——Day2


今天是被隔离的第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个半月以来吃到的第一个苹果!苹果好好吃呜呜呜😭

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值