Promise - 图1

API

Promise.race()

race(赛跑)
Promise.race()将多个promise实例,包装成一个新的promise实例。
const p = Promise.race([p1, p2, p3])p1, p2, p3有一个实例率先改变状态,**p**的状态也跟着改变。率先改变的Promise实例的返回值,就传给p的回调函数。
举例:指定时间内没有获得结果,就将 Promise 的状态变为reject,否则变为resolve。

  1. const p = Promise.race([
  2. fetch('xxxx'),
  3. new Promise((resolve, reject) => {
  4. setTimeout(() => {
  5. reject(new Error('request timeout ......'))
  6. }, 指定时间)
  7. })
  8. ])
  9. p.then(console.log).catch(console.error)
  10. // 未超时代码
  11. const p = Promise.race([
  12. new Promise((resolve, reject) => {
  13. setTimeout(() => resolve('OK...'), 3000)
  14. }),
  15. new Promise(function (resolve, reject) {
  16. setTimeout(() => reject(new Error('request timeout ......')), 5000)
  17. })
  18. ]);
  19. p
  20. .then(console.log)
  21. .catch(console.error);

Promise.all()

Promise.all()将多个promise实例,包装成一个新的promise实例。
Promise.all()参数可以不是数字,但必须具有 Iterator 接口,并且返回的每一个成员必须是 Promise实例。
const p = Promise.all([p1, p2, p3])p的状态由p1, p2, p3来决定,分为两种情况:

  1. p1, p2, p3的状态全是fulfilled时,p的状态才是fulfilledp1, p2, p3返回值组成的数组,传给p的回调函数。
  2. p1, p2, p3中有任意一个状态是rejectedp的状态就是rejected,第一个rejected实例的返回值,传给p的回调函数。

注意:p1, p2, p3中有自己的catch时,不会触发Promise.all()定义的catch方法。原因:执行完catch方法后,实例已经变为resolve了。