Избегать setInterval / setTimeout? - PullRequest
0 голосов
/ 04 июля 2018

У меня следующая проблема: в моей функции с 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 голосов
/ 04 июля 2018

Ваш таймер для setTimout очень близок к 20000 / 17. Если время рекурсии не точное, вы начнете видеть наложение, когда следующие setInterval начнут вызывать новые таймауты до того, как все 17 старых тайм-аутов будут выполнены. Кроме того, таймеры в javascript не гарантируют точность с высоким разрешением.

Если вы просто хотите, чтобы что-то непрерывно выполнялось в цикле, рассмотрите возможность использования setInterval и вычислите i % 17. Например:

let i = 1
setInterval(function () {
     // do stuff with `i`
     console.log(i)
     i = i % 17 + 1
}, 400);

It will be easier to debug and understand and won't have any chance of overlap.
...