Skip to content

手写Promise.all并存在最大并发限制

🕒 Published at:
js
function mockFetch(param) {
    return new Promise((resovle) => {
        setTimeout(() => {
            resovle(param);
        }, 2000);
    });
}
Promise.myAll = function (promiseArr) {
  let res, rej;
  const p = new Promise((resolve, reject) => {
    res = resolve
    rej = reject
  })

  let count = 0
  let i = 0
  const result = []
  let fullfilledCount = 0
  for (const promise of promiseArr) {
    const index = i
    i++
    count++
    Promise.resolve(promise).then((data) => {
      result[index] = data
      fullfilledCount++
      if (fullfilledCount === count) {
        res(result)
      }
    }, rej)
  }
  if (count === 0) {
    res(result)
  }

  return p
}
function limitedRequest(urls, maxNum) {
    let result = [];
    let index = 0;
    const pool = [];
    const initSize = Math.min(urls.length, maxNum);
    for (let i = 0; i < initSize; i++) {
        pool.push(run(urls.splice(0, 1)[0], index));
        index++;
    }
    function core(data, i) {
        result[i] = data;
        if (urls.length === 0) {
            return Promise.resolve(result);
        }
        let p = run(urls.splice(0, 1)[0], index);
        index++;
        return p;
    }
    function run(url, index) {
        return mockFetch(url).then((data) => core(data, index));
    }
    return Promise.myAll(pool).then((data) => {
        return Promise.resolve(data[0]);
    });
}
console.time('测试耗时');
limitedRequest([1, 2, 3, 4, 5, 6, 7, 8], 3).then((data) => {
    console.log(data);
    console.timeEnd('测试耗时');
});