promise基础写法
1. 什么是Promise:
- 回调函数嵌套回调函数被称作回调地狱,代码层层嵌套,变得难以维护。代码臃肿,可读性差,耦合度过高。
- ES2015的标准里,Promise的标准化,一定程度上解决了JavaScript的流程操作问题。Promise对象是一个异步编程的解决方案,可以将异步操作以同步的流程表达出来, 避免了回调地狱写法(Promise其实就是处理异步的)
2. Promise对象:
- Promise对象是一个构造函数,可以实例化使用
- Promise对象上有all、allSettled、any、race、resolve、reject等多个静态方法
- Promise的原型对象上有 then、catch、finally等多个原型方法
3.promise的基础使用
因为Promise是处理异步的(它本身并不是异步函数),所以请先实例化得到一个promise的实例 在实例化Promise对象的时候,需要传递一个回调函数作为参数,内部书写对异步代码的处理
将一个异步的回调地狱,以一个同步的形式表达出来,而不是转为同步
Promise的三种状态和值
1.Promise实例化的时候接受一个回调函数作为参数,这个回调函数还要接受两个参数分别是resolve函数,和reject函数
- resolve函数:当异步代码执行成功后调用,函数的参数就是成功后需要给promise实例的值
- reject函数:当异步代码执行失败后调用,函数的参数就是失败后需要给promise实例的失败信息
- promise实例有两个属性:
- PromiseState:当前promise实例的状态
- pending:正在进行中,初始状态
- fulfilled/resolved :成功状态,此状态只能由pending转变而来
- rejected:失败状态,此状态只能由pending转变而来
- PromiseResult:当前promise实例得到的结果
- 调用resolve或者reject函数传递的参数
完整的Promise处理异步
// 使用trycache之后,无论哪种状况,实例都会进行状态改变的
// try的作用是同步捕捉错误的代码,找到出错之后再交给catch来处理
try {
console.log("A数据开始请求。。。");
//模拟报错,抛出一个异常
// throw new Error("您的请求因为您的人品失败了")
//异步请求A数据
setTimeout(() => {
console.log("A数据请求成功!!!");
//得到请求的数据
const dataA = ["laoyang", "laowang", "laonie"];
//调用resolve方法 并把数据传递出去,当请求成功之后,告诉实例我已经完成了,实例上的状态就发生了改变
resolve(dataA);
}, 2000);
} catch (e) {
console.log("请求出错", e);
//调用reject 告诉promise实例,当前请求出错
reject(e);
}
07.then方法和返回值
Promise的原型对象上有一个then方法
- 用来处理promise状态改变后的操作,then的执行是同步执行的
- then中接受两个回调函数作为参数,当调用then的promise实例状态发生变化的时候,就会执行内部对应的回调函数
- then的第一个回调函数是处理promise实例成功状态的,函数的参数就是当前成功promise实例的值,then的第二个回调函数是处理promise实例是失败状态的,函数的参数就是当前失败的promise实例的值
总结来说,then的执行是同步的,但是then中的回调函数的执行是一定异步的,then的同步执行就是为了准备两个回调函数
1.成功状态的promise实例调用,then方法返回值:
- then方法默认返回成功状态的promise实例,值为这个回调函数的返回值
- 如果then方法的回调函数出现报错,则then方法返回失败的promise实例,值为错误信息
- 当then的回调函数返回的是promise实例的时候
- 当回调函数return的promise实例是成功状态的时候,则then的返回值也是成功状态的promise实例,值为内部return的promise实例的值
- 当回调函数return的promise实例是失败状态的时候,则then的返回值也是失败状态的promise实例,值是内部return的promise实例的失败信息
2.失败状态的promise实例调用,then方法返回值:和成功状态调用promise实例的返回值是一致
浅浅的理解resolve和reject的作用,它们就相当于一个信号,当他们执行的时候,当前的代码才算是真正的处理完,p1的状态才会发生改变,这样后面的then或者其他的东西,检测到p1的状态发生改变之后才会执行内部的回调函数
catch方法及返回值
Promise的原型对象上有一个catch方法,专门用来处理失败的promise对象的
- 里边只有一个回调函数作为参数
- 当调用catch的promise对象状态变为失败的时候,会执行catch中的回调函数,所以catch方法是同步的,catch中的回调函数的是异步的
- catch返回值的规则和then的第二个参数的规则一致
总结:then或者catch返回promise状态的总结:
- 失败:1. then或者catch中的回调函数只要报错、2. then或者catch中的回调函数中返回失败的promise对象
- 成功:默认成功、返回成功promise对象也是成功
值的穿透
1.then或者catch中不书写回调函数,而是书写了其他值,则then或者catch的的promise实例的状态和值,和调用then或者catch的promise实例一致
2.如果失败的promise实例调用then 或者 成功的promise实例调用catch ,then和catch都会执行,但是不会执行内部的回调函数,并直接穿透
3.then和catch的关系:then()中接受两个回调函数,将后面那个单独摘出来,就演变成了catch()的第一个回调函数,所以以后在使用的过程中,then中只写第一个回调函数,专门处理成功,以后失败就交给catch()中的回调函数进行处理
4.p1和p2虽然值是一样的,但是两个实例却不是同一个东西,这种现象叫做值得穿透
finally方法
- 无论promise实例的状态是成功还是失败调用的finally,都可以进入finally的回调函数进行执行
- finally的回调函数不需要任何参数
感觉是一种方法的演变,逐步的削减完成版then的两个回调函数的作用,让代码逐渐走向分工,语义性更好
finally方法的返回值:
- 如果finally的回调函数没有返回promise实例,则默认都是穿透的
- 如果finally的回调函数内部出现报错,则直接返回失败的promise实例,值为错误信息
- 如果finally的回调函数内部返回成功的promise实例,则还是穿透
- 如果finally的回调函数内部返回失败的promise实例,则finally返回的promise实例直接是失败的,值为内部回调失败promise的值
总结:一个不恰当的比喻,finnaly如果心情好(内部没错),就穿透,如果心情不好,就以为自己的返回状态为主