避免setInterval / setTimeout?

时间:2018-07-04 05:39:02

标签: javascript settimeout setinterval

我遇到以下问题:在使用setInterval()setTimeout()的函数中,我不断地重复执行以i为增量的动作。由于setInterval或setTimeout的延迟(我认为是后者),在脚本停止正确运行一段时间后,将同时执行多个任务。

该脚本在WhatsApp Web上使用,并单击前16个联系人,以每个检查在线状态。然后,如果联系人在线,它将打印日志。问题如下:在预设置时间(3小时左右)之后,该间隔会在旧功能完成之前重复其自身。所以我得到14,1,15,2,16,3,1,4 ...而不是1,2,3,5 ...

setInterval(function () {
    function writeNext(i) {
        if (i == 17)
            return;

        setTimeout(function () {
            writeNext(i + 1);
            selectContact(`${i}`)

            if (document.getElementsByClassName("O90ur")[0] !== undefined) {
                var online = document.getElementsByClassName("O90ur")[0].innerHTML
                    if (online == "online") {
                        console.log(`${i-1}`)
                    };
            }

        }, 1250);
    }

    writeNext(1);
}, 20000);

1 个答案:

答案 0 :(得分:0)

您的ch计时器非常接近setTimout。如果递归的时间不精确,您将开始看到重叠,在所有旧的17个超时完成之前,下一个20000 / 17开始调用新的超时。另外,JavaScript中的计时器也不能保证精确到高分辨率。

如果您只希望某事物连续循环运行,请考虑仅使用setInterval并计算setInterval。例如:

i % 17