一,模拟异步请求

使用回调函数返回请求到的异步数据

  • 当需要多个异步操作嵌套使用的话会导致代码的可读性差,代码不规整,造成回调地狱。
  • 异步请求的定义与使用需要大量的沟通成本。

使用Promise重构什么是Promise? promise是一个类。在网络请求函数中可以给调用者返回一个承诺对象,通过这个承诺可以拿到成功或者失败的返回响应。 在这个承诺对象中需要传入一个executor回调函数,这个回调函数会立即执行,并且需要给这个函数传入另外两个回调函数:resolver和reject。当调用resolve函数时,会执行promise对象的then方法,当调用reject函数时,会执行promise对象中的catch方法。

  • 1,待定(pending): 初始状态,既没有被兑现,即也没有被拒绝;当执行executor中的代码时,处于该状态;
  • 2,已兑现(fulfilled): 意味着操作成功完成,即执行了resolve时,处于该状态;
  • 3,已拒绝(rejected): 意味着操作失败,即执行了reject时,处于该状态;
new Promise((resolve, reject) => {
  resolve("成功"),
  reject("拒绝");
}).then(
  (res) => {
    console.log(res);
  },
  (err) => {
    console.log(err);
  }
);resolve方法参数
  • 1,如果resolve传入一个普通的值或者对象,那么这个值会作为then回调的参数。
  • 2,如果resolve中传入的是另外一个Promise,那么这个新Promise会决定原Promise的状态。
  • 3,如果resolve中传入的是一个对象,并且这个对象有实现then方法,那么会执行该then方法,并且根据then方法的结果来决定Promise的状态。
  • fulfilled的回调函数:当状态变成fulfilled时会回调的函数;
  • reject的回调函数:当状态变成reject时会回调的函数;

then方法的多次调用:

  • 当then方法中的回调函数本身在执行的时候,那么它处于pending状态;
  • 当then方法中的回调函数返回一个结果时,那么它处于fulfilled状态,并且会将结果作为resolve的参数;
  • - 情况一:返回一个普通的值;
  • - 情况二:返回一个Promise;
  • - 情况三:返回一个thenable值;
  • 当then方法抛出一个异常时,那么它处于reject状态;

catch方法的返回值catch方法的返回值也是一个新的promise对象,然后把返回的内容resolve出去,注意不是reject出去。

finally方法finally是在ES9(ES2018)中新增的一个特性:表示无论Promise对象无论变成fulfilled还是reject状态,最终都会被执行的代码。finally方法是不接收参数的,因为无论前面是fulfilled状态,还是reject状态,它都会执行。

  • 当所有的Promise状态变成fulfilled状态时,新的Promise状态为fulfilled,并且会将所有Promise的返回值组成一个数组;
  • 当有一个Promise状态为reject时,新的Promise状态为reject,并且会将第一个reject的返回值作为参数;
  • 在ES11(ES2020)中,添加了新的API Promise.allSettled。
  • 该方法会在所有的Promise都有结果(settled),无论是fulfilled,还是reject时,才会有最终的状态;
  • 并且这个Promise的结果一定是fulfilled的
Promise.race([p1, p2, p3]).then((res) => {
  console.log(res); //p1
});Promise类方法:anyany方法是ES12中新增的方法,和race方法是类似的,any方法会等到一个fulfilled状态,才会决定新Promise的状态;如果所有的Promise都是reject的,那么也会等到所有的Promise都变成rejected状态,会报一个AggregateError的错误。
Promise.any([p1, p2, p3]).then((res) => {
  console.log(res); //p1
});