为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

千巷猫影 2019-03-19 17:19:17
代码如下: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

夜深了,脑子不太清醒,希望我的意见能给你带来帮助


查看完整回答
反对 回复 2019-04-03
  • 1 回答
  • 0 关注
  • 413 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信