请求异步控制并发数,防抖,节流

301 阅读1分钟

实现

 function limitRequest(urls = [], limit  ){
   return new Promise((resolve, reject) =>{
     const len = urls.lengtn
     let count = 0
     
     // 同时启动limit个任务
     while (limit>0) {
       statr()
       limit -= 1
     }
     
     
     function statr() {
      const url = urls.shifs()  // 从数组中拿第一个
      if(url){
       axios.post(url).then(res=>{
         // todo
       }).catch(err=>{
         // todo
       }).finally(()=>{
         if(count == len - 1){
          // 最后一个任务完成
           resolve()
          }else{
           // 完成之后,启动下一个任务
           count++
           start()
          }
       })
      }
     }
   }
 }
 
 
 //  调用
 
 limitRequest(['url1','url2','url3','url4','url5',],5)
 

 

防抖

  function debounce(fn,delay){
    let timer
    return function(...args){
      if(timer){
        clearTimeout(timer)
      }
      timer = setTimeout(()=>{
       fn.apply(this,args)
      },delay)
    }
  }
  
// 调用
  function task(){
   console.log('防抖')
  }
  const debounceTask=debounce(task,1000)

节流


function throttle(fn,delay){
 let last = 0  // 上一次触发时间
 return function (...args){
   const now = Date.now()
   if(now - lat > delay){
    last =now 
    fn.apply(this,args)
   }
 }
}

// 调用

function task(){
  console.log('节流')
}

const throttleTask = throttle(task,1000)