前端面试题 - 86. 实现promiseAll和allSeleted

122 阅读1分钟

Promise.all()Promise.allSettled() 均是 Promise 的静态方法,区别在于对于 Promise 失败的处理方式不同,Promise.all() 遇到失败会直接抛出异常中止执行,而 Promise.allSettled() 统一返回所有 Promise 的状态和结果。

下面是一个简单的 promiseAllallSelected 的实现:

function promiseAll(promises) {
  return new Promise((resolve, reject) => {
    const results = [];
    let completedCount = 0;

    if (promises.length === 0) {
      resolve(results);
      return;
    }

    for (let i = 0; i < promises.length; i++) {
      promises[i].then(
        result => {
          results[i] = result;
          completedCount++;
          if (completedCount === promises.length) {
            resolve(results);
          }
        },
        error => {
          reject(error);
        }
      );
    }
  });
}

function allSelected(promises, conditionFn) {
  return promiseAll(promises).then(values => {
    if (conditionFn(values)) {
      // 执行一些操作
      return true;
    } else {
      throw new Error('Not all promises are fulfilled');
    }
  });
}

promiseAll 实现中,我们首先判断传入的 Promise 数组是否为空,如果是则直接返回一个 resolve 状态的 Promise。然后遍历数组中每个 Promise 对象,并对其使用 then 方法注册成功或失败的回调函数,在成功的情况下将结果保存到一个数组中,全部完成后,将保存结果的数组作为 Promise 对象的返回值 resolve 出去;如果其中有一个 Promise 失败,则直接 reject Promise。

allSelected 实现中,我们调用了自定义的 promiseAll 方法来处理 Promise 数组,然后根据条件函数来判断是否满足某些条件,如果满足条件,就执行一些操作;否则,返回一个错误信息。