Promise API简介 all allSettled any race

208 阅读2分钟

Promise API 简介

all,allSettled,any,race,这4个方法的参数都是一个数组

Promise.all([])

  1. 当参数数组中所有Promise实例的结果成功时,按照请求顺序返回成功的结果;
  2. 当参数数组中只要有一个Promise实例的结果失败时,则进入失败的回调。
const p1 = new Promise((resolve, reject) => {
    resolve(1);
})
const p2 = new Promise((resolve, reject) => {
    resolve(1);
})

const p3 = Promise.resolve('ok');

// 所有promise成功,则result成功,且结果值为3个结果值组成的一个数组
const result = Promise.all([p1, p2, p3]); // 3个均成功,可以用result.then()获取成功的结果数组
// 若有一个失败,则结果为失败,且最终的值是失败的promise对象的值

Promise.allSettled([])

  1. 执行结果不会失败,返回一个数组,分别对应参数数组中各个Promise实例的状态。
const p1 = Promise.resolve(1);
const p2 = Promise.reject(-1);
Promise.allSettled([p1, p2]).then(res=>{
    console.log(res);
}
// res打印如下:
/*
   [
    { status: 'fulfilled', value: 1 },
    { status: 'rejected', reason: -1 }
   ] 
*/

Promise.any([])

  1. 只要参数promise数组有一个变成 fulfilled,最后 any 返回的实例就会变成 fulfilled,并且返回第一个成功的promise的值;
  2. 如果数组中所有的promise都变成 rejected ,最后就会变成 rejected 状态。
const p1 = new Promise((resolve, reject) => {
    reject(1);
});
const p2 = new Promise((resolve, reject) => {
    reject(2);
});

const p3 = Promise.resolve("ok");

Promise.any([p1, p2, p3]).then(
    (r) => console.log(r), // 打印出'ok'
    (e) => console.log(e)
);

Promise.race([])

  1. 只要参数 Promise 数组中有一个实例率先改变状态,则 race 方法的返回状态就跟着改变;
  2. 率先改变状态的 Promise 实例的返回值,会传递给 race 方法的回调函数
// 案例1
const p1 = new Promise((resolve) => {
  setTimeout(() => {
    resolve(1);
  }, 3000);
});

const p2 = new Promise((resolve) => {
  setTimeout(() => {
    resolve(2);
  }, 2000);
});

Promise.race([p1, p2]).then(
  (v) => {
    console.log(v); // 打印2
  },
  (e) => {
    console.log(e);
  }
);

// 案例2
const p1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve(10);
  }, 3000);
});

const p2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject(20);
  }, 2000);
});

Promise.race([p1, p2]).then(
  (v) => console.log(v),
  (e) => console.log(e) // 打印20
);

// 案例3
 const p1 = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve(10);
    }, 3000);
});

const p2 = new Promise((resolve, reject) => {
    setTimeout(() => {
        throw new Error("我出错了");
    }, 2000);
});

Promise.race([p1, p2]).then(
    (v) => console.log(v), // 打印10
    (e) => console.log(e)
);
  • 抛出一个异常不会改变race的状态,所以案例3依然是由p1决定了race的状态。