theydy / notebook

记录读书笔记 + 知识整理,vuepress 迁移中 https://theydy.github.io/notebook/
0 stars 0 forks source link

Promise 并发个数限制 #36

Open theydy opened 3 years ago

theydy commented 3 years ago

const timeout = (delay = 1000) => new Promise(resolve => {
  setTimeout(resolve, delay);
})

const addTask = (time, order) => {
  return () => timeout(time).then(() => console.log(order))
}

const multiPromise = (promiseList, nums = 2) => {
  const result = [];
  const list = promiseList.slice();
  let doneNum = 0;

  return new Promise((resolve, reject) => {
      const run = (index) => {
        if (doneNum === promiseList.length) {
          resolve(result);
          return;
        }

        const promise = list.shift();
        promise && promise().then(res => {
          doneNum++;
          result[index] = res;
          const runIndex = promiseList.length - list.length;
          run(runIndex);
        }, err => {
          reject(err);
        })
      }

      for(let i = 0; i < nums; i++) {
        run(i);
      }
  })
}

const list = [
  addTask(1000,1),
  addTask(500,2),
  addTask(300,3),
  addTask(400,4),
];

multiPromise(list);
theydy commented 3 years ago

const multiPromise = function(args, nums = 2) {
  return new Promise(resolve => {
    const list = args.slice();
    const result = [];
    let done = 0;

    const run = async function(index, request){
      const res = await request();

      result[index] = res;
      done++;

      done === args.length - 1 && resolve(result);
      list.length && run(args.length - list.length, list.shift());
    }

    for(let i = 0; i < nums; i++) {
      list.length && run(i, list.shift());
    }
  })
}