我在实现timeChunk函数时,发现逻辑代码多走了一次。但不知道为什么会这样

代码如下:


var timeChunk = function(data, fn, count, time) {

    var that = this,

        obj,

        index = 0,

        timer;

    var start = function() {

        index += 1;

        for (var i = 0; i < Math.min(count || 1, (data.length + 1)); i++) {

            console.log('start次数:' + index + ',i值:' + i + ', data长度:' +

                (data.length + 1))

            console.log(Math.min(count || 1, (data.length + 1)))

            obj = data.shift();

            fn(obj);

        }

    }

    return function() {

        timer = setInterval(function() {

            if (data.length === 0) return clearInterval(timer);

            start();

        }, count)

    }


}


var arr = [

    'nice to meet you',

    'hello',

    'xixi',

    'nice to meet you',

    'hello',

    'xixi'

];


var getMsgToDo = function(obj) {

    var div = document.createElement('div');

    div.innerHTML = obj;

    document.body.appendChild(div);

}


var renderList = timeChunk(arr, getMsgToDo, 3, 200);


renderList()

最终start执行了3次 我传入的是3 共有6条数据 应该执行2次才对

经过排查 start在执行第二次的时候 i=2时退出了循环 但我不知道为什么会这样


千巷猫影
浏览 414回答 1
1回答

犯罪嫌疑人X

start执行第二次并且循环至i=2时是第五次循环,这次循环的判定是i < Math.min(count || 1, (data.length + 1))此时的data.length只剩一条数据了,所以i不小于2,退出了循环。但是定时器也还没有清理所以过了3ms之后又重新开始了从i=0的循环,这也证明了最后一段控制台输出的是:start次数为3。最后依我的愚见,应该将循环的判定改为i < count也就是将循环的核心代码改为for (var i = 0; i < count; i++) {&nbsp; &nbsp; console.log('start次数:' + index + ',i值:' + i + ', data长度:' +data.length)&nbsp; &nbsp; obj = data.shift();&nbsp; &nbsp; fn(obj);}最后附上我改后的控制台输出,不知道是不是你想要的样子:start次数:1,i值:0, data长度:6start次数:1,i值:1, data长度:5start次数:1,i值:2, data长度:4start次数:2,i值:0, data长度:3start次数:2,i值:1, data长度:2start次数:2,i值:2, data长度:1夜深了,脑子不太清醒,希望我的意见能给你带来帮助
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript