Twlig / issuesBlog

MIT License
3 stars 0 forks source link

字节面试题:编写并发请求控制函数scheduler #115

Open Twlig opened 2 years ago

Twlig commented 2 years ago

处理并发请求,以下是模拟异步请求,需要编写并发请求控制函数scheduler:

let request1 = () =>
  new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(1);
    }, 2000);
  });

let request2 = () =>
  new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(2);
    }, 1200);
  });

let request3 = () =>
  new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(3);
    }, 100);
  });

let request4 = () =>
  new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(4);
    }, 100);
  });

函数的用法如下:

let addRequest = scheduler(2);

addRequest(request1).then((res) => {
  console.log(res);
});

addRequest(request2).then((res) => {
  console.log(res);
});

addRequest(request3).then((res) => {
  console.log(res);
});

addRequest(request4).then((res) => {
  console.log(res);
});
//输出 2,3,4,1

scheduler函数实现:

精髓在于:

function scheduler(max = 10) {
  let tasks = [],
    pendingCount = 0;

  function run() {
    if (tasks.length > 0 && pendingCount < max) {
      pendingCount++;
      const { task, resolve, reject } = tasks.shift();
      task()
        .then(
          (res) => {
            resolve(res);
          },
          (err) => {
            reject(err);
          }
        )
        .finally(() => {
          pendingCount--;
          run();
        });
    }
  }
  return function (task) {
    return new Promise((resolve, reject) => {
      tasks.push({ task, resolve, reject });
      run();
    });
  };
}