如果我需要限制它的执行速度,如何重构这段代码
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());
});
我在想,我可以使用睡眠功能 - 但 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());
});