promise基础笔记-promise实例上的方法

143 阅读6分钟

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实例的失败信息
  1. 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如果心情好(内部没错),就穿透,如果心情不好,就以为自己的返回状态为主