Promise.all()
用于将多个 Promise 实例,打包成一个新的 Promise 实例。
const p = Promise.all([p1, p2, p3]);
- 只有p1、p2、p3的状态都会变fulfilled,p的状态才会变fulfilled,此时p1、p2、p3的返回值组成为一个数组,传给p的回调数。
- 只要p1、p2、p3之中有一个被rejected,p的状态就变了rejected,此时第一个reject实例的返回值,会传给p。
p1、p2、p3都是Promise实例,如果不是,会先调用Promise.resolve方法,将参数转为Promise实例,再进行一步处理。另外,Promise.all()方法的参数可以不是数组,但必须具备 Iterator 接口,并且返回的每个成员都是 Promise 实例。
注意,如果为参数的 Promise 实例,确定了catch方法,那么它一旦被rejected,就不会触及Promise.all()的catch方法。
Promise.allSettled()
接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例
let p = Promise.allSettled([1, p2, 3]);
// [
// { status: 'fulfilled', value: 3 },
// { status: 'fulfilled', value: 30 }
// { status: 'rejected', reason: -1 }
// ]
只有等到参数组的1, p2, 3都发生状态改变(不管是fulfilled还是rejected),返回的p状态才会变化。
与Promise.all()方法一样,如果参数不是Promise实例,就会调用Promise.resolve()方法,将参数转为Promise实例,再进行下一步处理
Promise.race()
用于将多个 Promise 实例,打包成一个新的 Promise 实例。
const p = Promise.race([p1, p2, p3]);
只要p1、p2、p3其中有一个实例率先改变状态,p的状态就跟着改变,而这个率先改变的Promise实例的返回值,就传给p的回调函数。
与Promise.all()方法一样,如果参数不是Promise实例,就会调用Promise.resolve()方法,将参数转为Promise实例,再进行下一步处理
Promise.any()
该方法接受一组Promise实例作为参数,打包成一个新的Promise实例返回。
let p = Promise.any([p1, p2, 3]);
只要参数p1, p2, 3有一个变成fulfilled状态,p实例就会变成fulfilled状态;如果所有参数实例都变成rejected状态,包装实例就会变成rejected状态。
注意: 它不会因为一个参数Promise 变成rejected而结束,必须等到所有参数 Promise 变成rejected才结束。
与Promise.all()方法一样,如果参数不是Promise实例,就会调用Promise.resolve()方法,将参数转为Promise实例,再进行下一步处理
差异比较
根据参数执行状态,比较p的状态决定因素、值以及是否需要等待参数实例执行完毕。
方法 | p状态决定因素 | p成功状态来源 | p失败状态来源 | 是否需参数实例全部执行完毕 | 作用场景 |
---|---|---|---|---|---|
all | 全成则成,一败就败 | 所有参数返回值组成的数组 | 第一个失败的返回值 | 成是,败否 | 要求一组异步操作全部成功或者其中一个失败就调用的场景 |
any | 一成则成,全败才败 | 第一个成功的返回值 | 一个AggregateError实例,属性errors是一个包含了所有成员的错误的数组 | 成否,败需 | 一组异步操作只要有一个成功或要求全失败就调用的场景 |
allSettled | 全变才变,不管成败 | 无论成败,都是一个包含对应参数状态的数组 | 无论成败,都是一个包含对应参数状态的数组 | 是 | 一组异步操作全部结束后再调用的场景 |
race | 谁先变跟谁 | 第一个成功的返回值 | 第一个失败的返回值 | 否 | 一组异步操作第一个成功或者失败后就调用的场景 |