Promise使用及常见问题

179 阅读4分钟

一.如何使用Promise

  1. API 语法 MDN搜索Promise

    • executor执行器(resolve,reject)

      executor函数:同步执行(resolve,reject)=>{}
      resolve函数:内部定义成功时调用 value=>{}
      reject函数:内部定义失败时调用 reason=>{}
      说明:executor会在Promise内部立即同步回调,异步操作在执行器中执行
      
    • Promise.all() //函数对象的方法

    • Promise.proptype.then() .catch() //实例对象原型上的方法

      onResolved函数:成功的回调函数 (value)=>{}
      onRejected函数:失败的回调函数 (reason)=>{}
      then(),指定用于得到成功value的成功回调和用于得到失败reason的失败回调,返回一个新的promise对象,未设置返回值再.then会返回undefined
      catch(),then()的语法糖,相当于then(undefined,onRejected)
      
    • Promise.resolve方法:(value)=>{}

      value:成功的数据或promise对象
      说明:返回一个成功/失败的promise对象
      
    • Promise.reject方法:(reason)=>{}

      reason:失败的原因
      说明:返回一个失败的promise对象
      
    • Promise.all方法:(promises)=>{}

      promises:包含n个promise的数组
      说明:返回一个新的promise,只有所有的promise都成功才成功,只要有一个失败了就直接失败
      const pAll = Promise.all([p1,p2,p3]) //当所有请求都成功时才能进行操作时使用
      pAll.then(
      	values=>{
          console.log("成功的结果",values); //返回结果是数组,顺序和执行顺序没关系,和all()里的数组顺序有关
        },
        reason=>{
          console.log("失败的原因",reason);
        }
      )
      
    • Promise.race方法:(promises)=>{}

      promises:包含n个promise的数组
      说明:返回一个新的promise,第一个完成的promise的结果状态就是最终的结果状态
      const pRace = Promise.race([p1,p2,p3]);
      pRace.then(
      	value=>{
          console.log("成功的结果",value); //结果是先执行完成的Promise
        },
        reason=>{
          console.log("失败的原因",reason);//第一个执行完成的Promise失败时返回
        }
      )
      

二.Promise关键问题

  1. 如何改变Promise的状态

    resolve(value):如果当前是pendding就会变为resolved
    reject(reason):如果当前是pendding就会变为rejectd
    抛出异常:如果当前是pendding就会变为rejeced
    new Promise((resolve,reject)=>{
      throw new Error("出错了"); //程序执行抛出了异常,Promise状态变为rejeced,new Error需要接收处理,否则会报错
      throw 3//抛出异常
    }
    )
    
  2. 一个Promise指定多个成功/失败回调函数,都会调用吗

    当Promise改变为对应状态时都会调用

  3. 改变Promise状态和指定回调函数谁先谁后

    都有可能,正常情况下是先指定回调再改变状态,但也可以先改变状态再指定回调
    	//then的回调函数先指定,在改变状态resolve(同时指定数据),异步执行回调函数
    如何先改变状态再指定回调?
    	//在执行器中直接调用resolve()/reject(),同步执行 
    	//延长更长时间才调用then(),异步执行回调函数
    什么时候才能得到数据
    
    1. Promise.then()返回的新Promise的结果状态由什么决定
    //简单表达:由then()指定的回调函数执行的结果决定
    //详细表达:
    		@1如果抛出异常,新Promise变为rejected,reason为抛出的异常
         @2如果返回的是非Promise的任意值,新Promise对象就会变为resolved,value为返回的值,没有返回值为undefined
         @3如果返回的是另一个新Promise,此Promise的结果就会成为新Promise的结果
    
  4. Promise如何串联多个操作任务

    Promisethen()返回一个新的Promise,可以使用then()的链式调用
    通过then()的链式调用串联多个同步异步任务,需要异步操作需要封装Promise里,有自己的resolvereject,才能成为下一个.then接收的结果,同步使用return 返回结果
    
  5. Promise异常传透

    当使用Promise的then链式调用时,可以再最后指定失败的回调
    前面任何操作出现异常,都会传到最后失败的回调中处理
    //抛出的异常,会默认逐层传入catch(上方未处理)
    => //定义箭头函数,还可以相当于return
    
  6. 中断Promise链

    当使用Promise的then链式调用时,在中间中断,不再调用后面的回调函数
    办法:在回调函数中返回一个pendding状态的Promise对象
    return new Promise (()=>{}) //pendding状态的Promise