使用范围ALL
/*** 高阶函数之数组切片* @M楸M 前言* 好处: 解决页面卡顿加载缓慢问题* 常用于渲染真实dom节点数据量大问题* 从根源上去处理这个问题 页面卡顿基本原因是主线程阻塞16.6ms渲染一次* 在16.6毫秒间分段处理* **/ function performChunk(data, taskHandler, scheduler) {if (typeof data === 'number') {data = {length: data}}/**数组长度为0结束处理**/ if (data.length === 0) {return}let i = 0/**开启下一个分片的执行**/ function _run() {/**防止分片越界**/ if (i >= data.length) {return}/**下一个分片任务的执行时机,一个渲染帧中空闲的时候开启分片执行 一帧16.6毫秒**/ scheduler((goOn) => {/**idle.timeRemaining剩余时间**/ while (goOn() && i < data.length) {taskHandler(data[i], i)i++;}_run()})}/**开启时调用函数开始切片处理**/ _run()
}/** 封装默认切片和自定义切片 **/ function browforChunk(data, taskHandler, customerScheduler) {const scheduler = (task) => {requestIdleCallback((idle) => {task(() => idle.timeRemaining())})}if (customerScheduler) {performChunk(data, taskHandler, customerScheduler)} else {performChunk(data, taskHandler, scheduler)}}/**使用案例***/
(function() {const data = [1,2,3,4,5]const taskHandler = (_, i) => {console.log(i)}const scheduler = (task) => {setTimeout(() => {const now = performance.now()task(() => performance.now() - now <= 10)}, 1000);}browforChunk(data, taskHandler, scheduler)
})()