Promise的基本理解

98 阅读2分钟

为什么需要Promise

  • 需求 通过ajax请求id,再根据id请求用户名,再根据用户名获取邮箱📮

回调地狱 在回调函数中嵌套回调 Promise解决了回调地狱

1)Promise的基本使用

Promise是一个构造函数,通过new关键字实例化对象 语法

new Promise((resolve , reject) =>{})
  • Promise接收一个函数作为参数
  • 这个函数接受两个参数
    • resolve :成功的函数
    • reject :失败的函数

promise实例有两个属性

  • state:状态
  • result:结果

2)Promise的状态

第一种状态:pending(进行中)

第二种状态:fulfilled(已完成,成功)

第三种状态:rejected(已拒绝,失败)

promise状态的改变

通过调用resolve() 和reject() 改变promise对象的状态

示例:

let p = new Promise((resolve,reject)=>{
      resolve();
     })
     console.dir(p);  //promise的状态为  fulfilled
let p = new Promise((resolve,reject)=>{
      reject();
     })
     console.dir(p);  //promise的状态为  rejected
  • resolve():调用函数,使当前promise对象的状态改成fuifilled
  • reject():调用函数,使当前promise对象的状态改成rejected

promise状态的改变是一次性的

3)promise的结果

示例

 let p = new Promise((resolve, reject) => {
        // resolve("成功的结果");
        reject("失败的结果");
      });
      console.dir(p);

Promise的方法 示例

let p = new Promise((resolve, reject) => {
      // resolve("成功的结果");
      reject("失败的结果");
    });
    // console.dir(p);

    // then方法函数
    // 有两个=>参数
    // 1.是一个函数
    // 2.还是一个函数
    // 返回值:是一个promise对象
    p.then(
      () => {
        // 当promise的状态为fulfilled时,执行
        console.log("成功时调用");
      },
      () => {
        // 当promise的状态为rejected时,执行
        console.log("失败时调用");
      }
    );
    console.dir(p);
  • 在then方法的参数函数中,通过形参使用promise对象的结果

then方法返回的是一个新的promise对象,他的状态是padding

⭐️⭐️⭐️ promise的状态不改变,不会执行then里面的方法

 // 如果promise的状态不改变,then里面的方法不会执行
    let p = new Promise((resolve, reject) => {});
    p.then(
      (res) => {
        console.log("成功");
      },
      (reason) => {
        console.log("失败");
      }
    );
    console.dir(p);

如果在then方法中,出现代码错误,会将返回的promise实例改为reject状态

 let p = new Promise((resolve, reject) => {
        resolve();
      });
      const t = p.then(
        (res) => {
          // 这里出错,会将t实例的状态改成reject
          console.log(a);
        },
        (reason) => {
          console.log("失败", reason);
        }
      );
      t.then(
        (res) => {
          console.log("成功", res);
        },
        (reason) => {
          console.log("失败52", reason);
        }
      );
      console.dir(t);

catch方法

  let p = new Promise((resolve, reject) => {})
        .then((res) => {
          // 成功时被执行
          console.log(res);
        })
        .catch((error) => {
          // 失败时被执行
          console.log(error);
        });