Source: performChunk.js

/**
 * @name: 分时函数
 * @param {Array|Number} datas 需要处理的数据,可以是数组,也可以是数字
 * @param {Function} consumer 消费者函数,对数据的处理逻辑
 * @return {void}
 * @example
 * // 1. 传入数组
 * performChunk([1, 2, 3, 4], (item, i) => {
 *    console.log(item, i);
 * }
 * // 2. 传入数字
 * performChunk(10, (item, i) => {
 *   console.log(item, i);
 * }
 */
function performChunk(datas, consumer) {
    // 参数归一化,兼容数字和数组
    if (typeof datas === "number") {
        datas = new Array(datas);
    }

    if (!datas.length) return;

    // console.log(datas);
    let i = 0; // 记录当前处理的索引
    // 执行一块任务
    function _run() {
        if (i === datas.length) return;
        requestIdleCallback((idle) => {
            // 浏览器还有空闲时间
            while (idle.timeRemaining() > 0 && i < datas.length) {
                // 提取出当前要执行的任务
                const item = datas[i];
                consumer && consumer(item, i);
                i++;
            }
            _run();
        });
    }
    _run();
}

export default performChunk;