如果我需要限制它的执行速度,如何重构此代码

How to refactor this code if I need to rate-limit it's execution speed

本文关键字:何重构 重构 代码 速度 执行 如果      更新时间:2023-09-26

我在想,我可以使用睡眠函数 - 但Javascript没有睡眠函数。

我怎样才能稍微减慢速度以防止解析速率限制?我想每 1 秒执行一 (1) Parse.Cloud.run方法。

$('.website').each(function(i) {
    var website = $(this).text();
    Parse.Cloud.run('getMainEmail', {url: website}, {
        success: function(result) {
        cell.next().text(result);
    },
    error: function(error) {
        console.log("Couldn't find email for website: " + website);
        console.log(error);
    }
});

目前,此代码在 DOM 中找到所有网站并同时触发大量 Parse 请求 - 导致它几乎立即限制我的速率。

只需使用 setTimeout 并将网站作为参数发送

$('.website').each(function(i) {
    var website = $(this).text();
    setTimeout(function(siteText){
    Parse.Cloud.run('getMainEmail', {url: siteText}, {
        success: function(result) {
        cell.next().text(result);
    },
    error: function(error) {
        console.log("Couldn't find email for website: " + siteText);
        console.log(error);
    }
    }, (i + 1) * 5000, website);
});

这应该可以解决问题:

window.setInterval(function(){
    //put your parse code in here
}, 5000)

https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setInterval

您可以使用队列来管理操作:

var timer;
var queue = [];
function enqueue(website) {
    queue.push(website);
    if (!timer) {
        handleItem(); // handle the first item right away
        timer = setInterval(handleItem, 5000);
    }
}
function handleItem() {
    var website = queue.shift();
    if (queue.length === 0 && !timer) { 
        // stop the timer
        clearInterval(timer); 
        timer = null;
    }
    Parse.Cloud.run('getMainEmail', {url: website}, {
        success: function(result) {
            cell.next().text(result);
        },
        error: function(error) {
            console.log("Couldn't find email for website: " + website);
            console.log(error);
        }
    });
}

然后,您的原始代码将变为:

$('.website').each(function(i) {
    enqueue($(this).text());
});
<小时 />

如果您不介意在处理第一个项目之前有轻微的延迟,则可以有一个连续运行的间隔,并且设计变得更加简单:

var queue = [];
setInterval(function () {
    if (queue.length) { 
        var website = queue.shift();
        Parse.Cloud.run('getMainEmail', {url: website}, {
            success: function(result) {
                cell.next().text(result);
            },
            error: function(error) {
                console.log("Couldn't find email for website: " + website);
                console.log(error);
            }
        });
   }
}, 5000);
$('.website').each(function(i) {
    queue.push($(this).text());
});