面试官请不要再问我Promise啦

92 阅读2分钟

核心:解决回调地狱,实现js异步编程

状态变化:

每个promise对象的状态只会改变一次,初始状态为pending

执行resolve()后pending->resolved

执行reject()后pending->rejected

promise实例的api:

then

then(res=>{},err=>{}),当前promise对象的状态不为pending就可以调用,只接受回调函数作参数。当前对象状态为resolved调用第一个回调函数,状态为rejected则调用第二个回调函数。

then函数默认返回一个状态为resolved的promise对象(如果返回值是基本数据类型也会包装成promise对象返回)。也可以设置return返回任意状态的promise对象。

catch

catch()是then第二个回调函数的语法糖,也就是用来捕获错误的,而then优先捕获错误,如果没有设置then第二个回调函数,则由catch捕获

finally

无论promise对象的状态是啥都会执行finally函数,本身无返回值,返回值默认是上一个then函数返回的值。本质就是then()的特例

Promise.prototype原型对象上的api:

all

同时传入多个promise对象即一个数组,同时处理。当所有promise的对象都转为resolved时,all函数返回一个状态为resolved的promise对象,then中的res是一个数组。当有promise状态转为rejected时,all函数返回的则是一个rejected的promise对象,这个时候函数只会返回第一个失败状态promise对象返回的值。与运算

应用场景:同时发起多个网络请求,将结果拼接到一起返回

对比一下两个例子:

race

同时传入多个promise对象即一个数组,同时处理。当数组中的promise对象出现状态变化了,函数就会结束调用,如果第一个发生状态的promise的对象状态为resolved,那么函数返回一个状态为resolved的对象,反之亦然

应用场景:为网络请求设置一个定时器,如果超时了,race函数返回定时器的状态,即返回一个rejected的promise对象。如果网络请求在规定时间内返回,那么race函数返回promise对象状态是当前网络请求返回的状态

any

同时传入多个promise对象即一个数组,同时处理。当数组中的promise对象都变为rejected了,any函数才会返回状态为rejected的promise对象,当数组中的对象出现resolved状态时,那么any函数就会返回状态为resolved的promise对象,这个时候函数只会返回第一个成功状态promise对象返回的值。或运算

allsettle

同时传入多个promise对象即一个数组,同时处理。函数默认返回状态为resolved的promise对象,通过res数组获得所有参数的返回值,返回值是一个数组,元素是每个状态的描述对象