JS 在单线程上玩的越来越6,不禁产生这样的思考,如何将同步循环转换成异步循环。在单线程中,异步循环还是很有必要的,如果同步数据量过大,会造成浏览器卡死。

递归

JS 的异步无非那几个 api,我以 settimeout 为例,套一个函数使用递归即可:

const arr = [1,2,3,4,5,6,7]
let count =0 
const go= ()=>{
  if(count < arr.length){
    setTimeout(() => {
      console.log(arr[count])      
      count = count+1
      go()
    }, 1000);
  }
}
go()

利用死循环 api

死循环 api 比如 idleCallback 之类:

const arr = [1,2,3,4,5,6,7]
let count =0 

const go = (deadline)=>{
  while ((deadline.timeRemaining() > 0 || deadline.timeout) && count < arr.length) {
    console.log(arr[count])
     count = count + 1
  }
}
window.requestIdleCallback(go, { timeout: 1000 })
© 版权声明
评论 抢沙发

请登录后发表评论