一.如何使用Promise
-
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关键问题
-
如何改变Promise的状态
resolve(value):如果当前是pendding就会变为resolved reject(reason):如果当前是pendding就会变为rejectd 抛出异常:如果当前是pendding就会变为rejeced new Promise((resolve,reject)=>{ throw new Error("出错了"); //程序执行抛出了异常,Promise状态变为rejeced,new Error需要接收处理,否则会报错 throw 3;//抛出异常 } ) -
一个Promise指定多个成功/失败回调函数,都会调用吗
当Promise改变为对应状态时都会调用
-
改变Promise状态和指定回调函数谁先谁后
都有可能,正常情况下是先指定回调再改变状态,但也可以先改变状态再指定回调 //then的回调函数先指定,在改变状态resolve(同时指定数据),异步执行回调函数 如何先改变状态再指定回调? //在执行器中直接调用resolve()/reject(),同步执行 //延长更长时间才调用then(),异步执行回调函数 什么时候才能得到数据- Promise.then()返回的新Promise的结果状态由什么决定
//简单表达:由then()指定的回调函数执行的结果决定 //详细表达: @1如果抛出异常,新Promise变为rejected,reason为抛出的异常 @2如果返回的是非Promise的任意值,新Promise对象就会变为resolved,value为返回的值,没有返回值为undefined @3如果返回的是另一个新Promise,此Promise的结果就会成为新Promise的结果 -
Promise如何串联多个操作任务
Promise的then()返回一个新的Promise,可以使用then()的链式调用 通过then()的链式调用串联多个同步异步任务,需要异步操作需要封装Promise里,有自己的resolve和reject,才能成为下一个.then接收的结果,同步使用return 返回结果 -
Promise异常传透
当使用Promise的then链式调用时,可以再最后指定失败的回调 前面任何操作出现异常,都会传到最后失败的回调中处理 //抛出的异常,会默认逐层传入catch(上方未处理) => //定义箭头函数,还可以相当于return -
中断Promise链
当使用Promise的then链式调用时,在中间中断,不再调用后面的回调函数 办法:在回调函数中返回一个pendding状态的Promise对象 return new Promise (()=>{}) //pendding状态的Promise