解析一道经典的promise例题

125 阅读1分钟
  //1 2 11 4 5 7 10
      console.log(1);
      const promise = new Promise((resolve, reject) => {
        reject();
        console.log(2);
      });
      promise
        .then(() => {
          console.log(3);
          return new Promise((resolve) => {
            reject();
          });
        })
        .catch(() => {
          console.log(4);
        })
        .then(() => {
          console.log(5);
          return new Promise((reject, resolve) => {
            reject();
            // resolve();
          });
        })
        .catch(() => {
          console.log(6);
          throw new Error("报错了~");
        })
        .then(() => {
          console.log(7);
          throw new Error("报错了~");
        })
        .then(() => console.log(8))
        .then(() => console.log(9))
        .catch(() => console.log(10));

      console.log(11);
  // 执行过程得分析:
  /* 首先执行同步代码
         1. console.log(1)
         2.执行promise中得回调函数
        reject();不会立马执行then只是改变了返回值得状态
         console.log(2); 
         3.执行同步代码promise.then(),仅仅执行这个外壳,将内部得回调函数给暴露出来,内部得回调函数是异步的,
         所以还不能执行,后面的一堆.的东西,都是在前面的返回值的基础上才会执行的,当前面的部分,没有返回值,后面的是不会执行的,里面的回调函数都是异步的,只有当前面一个promise的实例状态发生改变之后,才会执行内部的回调函数,(外壳都是同步,准备好异步函数)
         4.console.log(11)
         5.没有同步代码了,开始执行then或者cathch中的回调函数
         6.当前是failed的所以第一个then穿透,它没有处理失败的回调函数
         7.执行catch中的代码console.log(4);,返回成功
         8. 执行console.log(5);,注意回调函数和名字无关,只和书写顺序有关,返回成功
         9.穿透catch 执行then,console.log(7);返回失败
         10.执行() => console.log(10),*/

  //  注意:巧计:只记住报错的情况,1.内部报错,2.返回失败的promise才会返回失败,其他都是成功