首页 > 解决方案 > 如何在不减慢网页速度的情况下减慢自定义 Javascript 扩展程序的速度?

问题描述

我有一个自定义 javascript 扩展,可以解决网站上的调查。不幸的是,它工作得有点太好了——它检查了复选框并且点击下一个太快了。该网站检测到这一点,意识到它是一个正在解决调查的机器人,并发送一个错误,说有太多的请求。我可以使用哪些代码来减慢不会停止网站的扩展程序?

我特别尝试使用我自己编写的 sleep() 函数,它基本上完全停止了 javascript 程序。我只是在 checkBox 方法之前写了一个快速的“sleep(1500)”。这实际上最终停止了整个页面上的 javascript,这与我想要的完全相反。

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

我的目标是让扩展等待大约 3 到 4 秒,然后再选中该框并点击下一步,之后,它会再等待 3 到 4 秒,依此类推。实际发生的事情是在花哨的动画之前网页已完成的复选框,扩展程序已选中右侧框并点击下一步。如前所述,这太快了。基本上,我想暂停扩展 3 秒,同时让网页上的 javascript 继续工作。

标签: javascriptgoogle-chromegoogle-chrome-extension

解决方案


您可以通过三种方式实现这一目标。

第一种方法是跳过创建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);

但是,IE 不支持 async/await,因此如果您希望支持它,最好的方法是使用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
});

推荐阅读