面试官:有n个url要请求,但是限制同时在请求的数量为五个

54 阅读1分钟
  • 这是今天面试的时候遇到的题目,之前也面到过秒解了,结果今天卡壳了没写出来。
  • 面试官提醒说用Promise.all来分批请求。但是我觉得不对,如果一批请求里有一个请求很慢,那所有都得等他请求完才行。
  • 以下是我的方法,仅供讨论:

声明一个请求函数,在then里,即上一个请求结束后,递归地调用下一个请求

let urls = Array.from(new Array(100).keys())  // 生成请求的url

// 模拟异步请求
const sendMessage = (url) => {  
  return new Promise((resolve) => {
    console.log(`start request ${url}`);
    setTimeout(() => {
      resolve(url);
    },Math.random()*10000);
  })
}

// 递归调用函数
const limitMessages = (urls ,limit) => {
  let count = 0;
  let lens = urls.length;
  const pooling = (url) => {
    sendMessage(url).then((v) => {
      console.log(`request ${v} finished`);
      if(++count < lens){
        pooling(urls[count]);
      }
    })
  }
  for(let i = 0 ; i < limit ; i++){
    pooling(urls[count++]);
  }
}

// 调用方法
limitMessages(urls,5)

做讨论用,如果有什么问题欢迎指出。