2024面试promise手写题大全

169 阅读1分钟

1. promise超时,返回error

传入一个promise和超时的时间,如果在time的时间内promise没有返回就抛出错误

/**
 *  传入一个promise和超时的时间,如果在time的时间内promise没有返回就抛出错误
 * @param {Promise} promise
 * @param {Number} time
 * @returns
 */
function promiseTimeout(promise, time) {
  const timePro = new Promise((resolve, reject) => {
    setTimeout(function () {
      reject('超时');
    }, time);
  });

  return Promise.race([promise, timePro]);
}
 

2. 实现reTry函数

/**
 * 实现一个函数:function retry(fn, interval, times)
 * fn是一个promise,
 * 重试上限为times次,
 * 重试间隔为interval,
 * 重试成功返回成功的结果,失败返回失败的结果
 * @param {Promise} fn
 * @param {number} interval
 * @param {number} times
 */

async function reTry(fn, interval, times) {
  let allTimes = 0;
  while (allTimes < times) {
    try {
      const res = await fn();
      return res;
    } catch (error) {
      allTimes++;
      if (allTimes === times) {
        throw error;
      } else {
        await new Promise((res, rej) => setTimeout(res, interval));
      }
    }
  }
}


3. 并发请求

/**
 *  并发请求
 * @param {[]} promiseArr    Promise 数组
 * @param {number} maxNum    最大并发数
 * @returns
 */
async function conCurrentRequest(promiseArr, maxNum) {
  return new Promise((resolve, reject) => {
    const allNum = promiseArr.length;
    let curIndex = 0;
    let successCount = 0;
    let allData = [];
    async function run() {
      let i = curIndex;
      try {
        let res = await promiseArr[curIndex++]();
        allData[i] = res;
      } catch (error) {
        allData[i] = error;
      } finally {
        successCount++;
        if (successCount === allNum) {
          resolve(allData);
        }
        if (curIndex < allNum) {
          run();
        }
      }
    }
    for (let j = 0; j < maxNum; j++) {
      run();
    }
  });
}