Promise.all()
Promise.all方法用于将多个Promise实例,包装成一个新的Promise实例。
var p = Promise.al1([p1,p2,p3]);
Promise.all方法接受一个数组作为参数, p1、 p2、p3都是Promise对象的实例,如果不是,就会先调用Promis .resolve方法,将参数转为Promise实例,再进一步处理。( Promise .all方法的参数可以不是数组,但必须具有lterator接口,且返回的每个成员都是Promise实例。)
p的状态由p1 .p2 、p3决定,分成两种情况。
(1)只有p1、 p2、 p3的状态都变成 fulfilled,p的状态才会变成 fulfilled,此时 p1 、 p2、 p3的返回值组成一个数组,传递给p的回调函数。
(2)只要p1、p2、 p3 之中有一个被rejected,p 的状态就变成rejected,此时第一个被reject 的实例的返回值,会传递给p的回调函数。
Promise.race()
Promise.race方法同样是将多个Promise实例,包装成一个新的Promise实例。
var p = Promise.race([p1,p2,p3]);
代码中,只要 p1、 p2、p3之中有一个实例率先改变状态, p的状态就跟着改变。那个率先改变的Promise实例的返回值,就传递给 p的回调函数。
Promise.race方法的参数与Promise.al1方法一样,如果不是Promise实例,就会先调用下面讲到的 Promise.resolve方法,将参数转为Promise实例,再进一步处理。
Promise.resolve()
有时需要将现有对象转为Promise对象,Promise.resolve
方法就起到这个作用。
Promise.resolve('test')
// 等价于
new Promise(resolve => resolve('test'))
Promise.resolve方法的参数分成四种情况。
- 参数是一个Promise实例
如果参数是Promise实例,那么、Promise.resolve将不做任何修改、原封不动地返回这个实例。 - 参数是一个thenable对象
thenable对象指的是具有then方法的对象,比如下面这个对象。
let thenable = { then: function(resolve, reject) { resolve(111); };
Promise.resolve方法会将这个对象转为Promise对象,然后就立即执行thenable对象的 then方法。 -
参数不是具有
then
方法的对象,或根本就不是对象
如果参数是一个原始值,或者是一个不具有then
方法的对象,则Promise.resolve
方法返回一个新的Promise对象,状态为Resolved
。 - 不带有任何参数
Promise.resolve
方法允许调用时不带参数,直接返回一个Resolved
状态的Promise对象。
Promise.reject()
Promise.reject(reason)
方法也会返回一个新的Promise实例,该实例的状态为rejected
。它的参数用法与Promise.resolve
方法完全一致。