race和any

一、关系

any是对race的补充:尽可能等一个fulfilled的结果

二、区别

场景Promise.race()Promise.any()

全fulfilled

onResolve,返回最早的fulfilled

onResolve,返回最早的fulfilled

fulfilled+rejected

不定,返回最早的rejected/fulfilled

onResolve,返回最早的fulfilled

全rejected

onRejected,返回最早的rejected

onRejected,返回所有的rejected

三、详解

1、Promise.race([promise, promise2, ...])

  • 并发,返回最早完成的那个任务的结果;

  • 始终返回最早的那个任务:如果fulfiled则执行onResolve,如果rejected则执行onReject

let p1 = new Promise(function (resolve, reject) {
  setTimeout(resolve, 500, "one");
});
let p2 = new Promise(function (resolve, reject) {
  setTimeout(reject, 100, "two");
});

Promise.race([p1, p2]).then(
  (value) => {
    console.log("onResolve: ", value);
  },
  (reason) => {
    console.log("onRejected: ", reason);
  }
);

输出:

onRejected:  two

2、Promise.any([promise, promise2, ...])

  • 尽可能返回fulfiled的任务的结果

  • 只要有一个fulfiled的任务,则执行onResolve;只有全都rejected时才执行onReject

let p1 = new Promise(function (resolve, reject) {
  setTimeout(resolve, 500, "one");
});
let p2 = new Promise(function (resolve, reject) {
  setTimeout(reject, 100, "two");
});

Promise.any([p1, p2]).then(
  (value) => {
    console.log("onResolve: ", value);
  },
  (reason) => {
    console.log("onRejected: ", reason);
  }
);

输出:

onResolve:  one

四、手写

1、Promise.race

Promise.myRace = function (taskList) {
  if (!Array.isArray(taskList)) throw new Error("参数必须为数组");
  return new Promise((resolve, reject) => {
    taskList.forEach((task, index) => {
      Promise.resolve(task).then(
        (value) => {
          resolve(value);
        },
        (reason) => {
          reject(reason);
        }
      );
    });
  });
};

2、Promise.any

Promise.myAny = function (taskList) {
  if (!Array.isArray(taskList)) throw new Error("参数必须为数组");
  return new Promise((resolve, reject) => {
    let reasons = [];
    taskList.forEach((task, index) => {
      Promise.resolve(task).then(
        (value) => {
          resolve(value);
        },
        (reason) => {
          reasons[index] = reason;
          if (reasons.length === taskList.length) reject(reasons);
        }
      );
    });
  });
};

Last updated