Promise all、race、allSettled、any

74 阅读2分钟

1. promise.all

  • 返回一个promise方法
  • 可以将多个Promise实例包装成一个新的Promise实例。
  • 成功的时候返回一个数组,把所有成功值都传回来。
  • Promise.all获得的成功结果数组顺序和执行传入的顺序一致。
  • 失败了,返回第一个失败状态的值。

使用场景:

Promise.all( ).then( )适用于处理多个异步任务且所有的异步任务都得到结果时的情况。

例如:页面中有两部分数据呈现,分别是两个后端接口,初始时loading为true,只有等这两部分数据都从接口中获取后,loading才会false。

function promiseAll(promise){
  return new Promise((resolve,reject)=>{
    let result = [];
    let count = 0;
    for(let i = 0;i<promise.length;i++){
      promise[i].then(res=>{
        result[i] = res;
        count++;
        if(count === promise.length){
          resolve(result);
        }
      },err=>{
        reject(err);
      })
    }
  })
}

2. promise.race

  • 返回一个promise方法
  • 若迭代器中的某个promise解决或拒绝,返回的promise就会解决或拒绝。

使用场景:

点一个按钮,发送多个请求,当接收到其中一个请求后,就响应相关的数据。

function promiseRace(promise) {
  return new Promise((resolve, reject) => {
    for (let i = 0; i < promise.length; i++) {
      promise[i].then(
        (res) => {
          resolve(res);
        },
        (err) => {
          reject(err);
        }
      );
    }
  });
}

3. promise.allSettled

  • 返回一个数组值,将每一个Promise值的状态返回。
  • 永远不会被rejected.

使用场景: 一个页面上有多个独立的表单,表单分别对应不同的接口,接口独立,没有顺序依赖,需要等到请求全部结束后给与用户提示表单提交的情况。

function promiseAllSettled(promise) {
  return new Promise((resolve, reject) => {
    let result = [];
    let count = 0;
    for (let i = 0; i < promise.length; i++) {
      const obj = {};
      promise[i].then(
        (res) => {
          count++;
          obj.value = res;
          obj.status = "fulfilled";
          result[i] = obj;
          if (count === promise.length) {
            resolve(result);
          }
        },
        (err) => {
          count++;
          obj.value = err;
          obj.status = "rejected";
          result[i] = obj;
          if (count === promise.length) {
            resolve(result);
          }
        }
      );
    }
  });
}

  1. promise.any
  • promise.any和promise.all是相反的一个方法
  • promise.any需要判断是否全部reject

使用场景: 从最快的服务器检索资源,如果存在多台服务器,从最快的一台服务器获取资源。

function promiseAny(promise) {
  return new Promise((resolve, reject) => {
    let result = [];
    let count = 0;
    for (let i = 0; i < promise.length; i++) {
      promise[i].then(
        (res) => {
          resolve(res);
        },
        (err) => {
          result[i] = err;
          count++;
          if (count === promise.length) {
            reject(err);
          }
        }
      );
    }
  });
}