代码如下: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时退出了循环 但我不知道为什么会这样
1 回答
犯罪嫌疑人X
TA贡献2080条经验 获得超4个赞
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++) {
console.log('start次数:' + index + ',i值:' + i + ', data长度:' +data.length)
obj = data.shift();
fn(obj);
}
最后附上我改后的控制台输出,不知道是不是你想要的样子:
start次数:1,i值:0, data长度:6
start次数:1,i值:1, data长度:5
start次数:1,i值:2, data长度:4
start次数:2,i值:0, data长度:3
start次数:2,i值:1, data长度:2
start次数:2,i值:2, data长度:1
夜深了,脑子不太清醒,希望我的意见能给你带来帮助
添加回答
举报
0/150
提交
取消