核心:解决回调地狱,实现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数组获得所有参数的返回值,返回值是一个数组,元素是每个状态的描述对象