Promise

186 阅读2分钟

基础理解

  • 定义 定义promise函数会返回表示异步操作的promise对象,类似于承诺未来某个时刻完成。

    let promise = readFile("text.txt");
    promise.then((content)=> {
        console.log(content);
    }), function(err) {
        console.log(err);
    }
    

  • 三种状态

    • pending(进行中) 如上定义时对象就是该状态

    • Fulfilled、Rejected 当对象完成异步操作时结果的两种状态成功和失败

    当我们操作挂起函数时,通过then方法去实现如上代码2~6


  • 执行器操作

    • 如果错误那么会向reject函数传递错误对象

    • 当操作成功时执行器向resolve传递文件内容,读取文件然后在去执行then中的操作。

    • 执行器是立即执行的,而then,catch方法会被丢入任务队列


  • 创建已处理

    • resolve 是直接创建的所以该方法永远不会有拒绝状态 直接采用resolve方法接受一个参数直接返回一个完整的promise对象
      let promise = Promise.resolve(12);
      promise.then(function(content){
          console.log(content); // 12
      })
      
    • reject 与上面相反是创建一个仅拒绝状态下所用的
      let promise = Promise.reject(12);
      promise.catch(function(vaule) {
          console.log(vaule);
      })
      

  • Promise串联

    • then、catch方法运行时创建并返回了一个promise对象所以事件可以直接串联起来
      let promise = Promise.resolve(42);
      promise.then((vaule) => {
          console.log(vaule);
      }).then(() => {
          console.log('串联实现');
      });
      
    • Promise链 可以给串联起来的下游Promise对象传递数值供操作

  • 响应多个Promise

    • Promise.all() 该方法相当于接受一个Promise数组转换成一个Promise对象,只有内部都处于完成状态合并的Promise对象才能完成
      let p1 = new Promise(function(resolve, reject) {
          resolve(1);
      });
      let p2 = new Promise(function(resolve, reject) {
          resolve(2);
      });
      let p3 = new Promise(function(resolve, reject) {
          resolve(3);
      });
      let p4 = Promise.all([p1, p2, p3]);
      p4.then(function(vaule) {
          console.log(vaule);
      })
      
    • .race() 合并对象遵循最先的实现的

实际案例理解

获取用户登录信息和详细信息

  let status = 1;
  let userLogin = (resolve, reject)=> {
      setTimeout(()=> {
          if(status == 1) {
              resolve({name:'司尘', emailAddress:'111@163.com'});
              }else {
                  reject('登录失败');
              }
      }, 2000);
  };
  let getUserInfo = (resolve, reject)=> {
      setTimeout(()=> {
          if(status == 1) {
              resolve({birthplace:'Hubei', profession:'student'});
          }else {
              reject('获取用户信息失败');
          }
      }, 2000);
  };
  let promise = new Promise(userLogin);
  promise.then((resolve, reject)=> {
      console.log(resolve);
      return new Promise(getUserInfo);
  }).then((resolve, reject)=> {
      console.log(resolve);
  });