Как замедлить свое собственное расширение Javascript, не замедляя веб-страницу? - PullRequest
0 голосов
/ 30 мая 2019

У меня есть собственное расширение javascript, которое решает опрос на веб-сайте.К сожалению, он работает слишком хорошо - он ставит флажок и слишком быстро нажимает на следующий.Веб-сайт обнаруживает это, понимает, что это бот решает опрос, и отправляет сообщение об ошибке, в котором говорится, что запросов слишком много.Какой код я могу использовать для замедления моего расширения, которое не остановит сайт?

Я специально пытался использовать функцию sleep (), которую я написал сам, которая в основном полностью останавливает программу javascript.Я просто пишу быстрый "сон (1500)" перед методом checkBox.Это фактически останавливает JavaScript на всей странице, что является полной противоположностью того, что я хочу.

function sleep(delay) {
    var start = new Date().getTime();
    while (new Date().getTime() < start + delay);
}

Я хочу, чтобы расширение подождало примерно 3-4 секунды, прежде чем установить флажок инажатие кнопки Далее, после чего оно будет ждать еще 3–4 секунды и т. д. Фактически, происходит то, что до того, как закончится необычная анимация для флажков, которые имеет веб-страница, расширение уже проверило правильное поле и нажало следующее.Как уже говорилось, это слишком быстро.По сути, я хочу остановить расширение на 3 секунды, продолжая работать с javascript на веб-странице.

1 Ответ

0 голосов
/ 30 мая 2019

Это можно сделать тремя способами.

Первый способ - пропустить создание функции sleep() и вместо этого просто использовать setTimeout().

// code before wait
setTimeout(()=>{
    // code after wait
}, 1500);

Другой способиспользовать async / await, как показано ниже.

// Promises require async/await to work in JavaScript
async function sleep(ms) {
    return new Promise(resolve => {
        setTimeout(resolve, ms); // this will call the resolve() function after the time has passed
    });
}

// You cannot use await in a non-async function, be sure to change that before adding this
await sleep(1500);

Однако async / await не поддерживается в IE, поэтому, если вы хотите его поддержать, лучше всего использовать setInterval().Интервал должен быть назначен переменной, иначе вы не сможете остановить его и это может вызвать некоторые проблемы.

function sleep(ms, todo) {
    var started = Date.now(); // get current time before wait
    var temp = setInterval(()=>{
        if ((Date.now() - started) > 1500) {
            clearInterval(temp); // stops the interval from repeating
            // avoid "X is not a function" errors
            if (typeof todo === 'function') todo(); // perform the code to do after the wait
        }
    }, 50);
}


// your code before the sleep function

sleep(1500, function() {
    // the code after the sleep function
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...