Promise的学习

96 阅读3分钟
  • Promise是一个对象,它代表了一个异步操作的最终完成(或者失败)及其结果值。

  • 三个状态:

    • 待定(pending):初始状态,既没有被兑现,也没有被拒绝;
    • 已兑现(fulfilled):意味着操作成功完成;
    • 已拒绝(rejected):意味着操作失败。
    • 待定状态的Promise对象要么会以一个值被兑现,要么会以一个原因被拒绝。
  • 属性

    • Promise.length:其值总是1;
    • Promise.prototype:Promise构造器的原型
  • 方法

    • Promise.all():返回一个新的Promise对象,只有在参数对象里所有的Promise对象都成功的时候才会触发成功。成功时:并将返回值的数组作为成功回调的返回值,顺序与参数对象的顺序一致;若失败:则会把第一个触发失败的Promise对象的错误信息作为它的失败错误信息。常被用于处理多个promise对象的状态集合。
    • Promise.allSettled():等到所有Promise都完成(每个promise返回成功或失败),返回一个promise,该promise在所有promise完成后完成,并带有一个对象数组,每个对象对应每个promise的结果。
    • Promise.any():其中一个成功就返回,返回那个成功的promise的值。
    • Promise.race():任意一个子promise成功或失败后,父promise也会用子promise的成功或失败作为参数调用,并返回该promise对象。
    • Promise.reject(reason):返回一个失败状态的promise对象,并将给定的失败信息传递给对于的处理方法
    • Promise.resolve(value):返回一个由value决定的promise对象。
  • 怎样使用Promise?

    • 约定:
      • 在本轮事件循环运行完成之前,回调函数是不会被调用的;
      • 即使异步操作已经完成(成功/失败),在这之后通过then()添加的回调函数也会被调用;
      • 通过多次调用then()可以添加多个回调函数,它们按照插入顺序进行执行。
    • 链式调用:
      • Promise.then()
      • Promise.catch()
      • Promise.finally()
      • 连续执行两个或多个异步操作。
      • 在过去,若想做多重的异步操作,会导致回调地狱;而使用promise则可以解决这个问题,形成一个Promise链。
      • 通过捕获所有的错误,甚至抛出异常和程序错误,Promise 解决了回调地狱的基本缺陷。
    • 组合
      • Promise.all()
      • Promise.race()
      • 使用async/await时序组合
      let result;
      for (const f of [func1, func2, func3]) {
      result = await f(result);
      }
      
    • 时序:为了避免意外,即使是一个已经变成resolve状态的promise,传递给then()的函数也总是会被异步调用。
      Promise.resolve().then(()=>console.log(2));
      console.log(1);  //1,2
      
  • 如何创建Promise?

    • Promise对象是由关键字new及其构造函数来创建的;
    • 该构造函数接收一个“处理器函数”作为参数;
    • “处理器函数”接收两个函数(resolve、reject)作为参数;
    • 当异步任务顺利完成且返回结果值时,会调用resolve函数;
    • 当异步任务失败且返回失败原因时,会调用reject函数。
    const fn = new Promise((resolve,reject)=>{
    	resolve();
      
      reject();
    })
    

扩展阅读:

1.超全面试题
2.手写Promise
3.手写Promise2