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

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

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

我怎样才能减慢一点以防止解析速率限制?我想每 5 秒执行一 (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 请求 - 导致它几乎立即限制我的速率。

这应该可以解决问题:

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

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

只需使用 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);
});

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

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());
});