我有一个JavaScript函数,实际上最终会进行服务器端调用。我想限制调用此函数的速率。
什么是一种简单的方法我可以限制我的javascript函数调用的速度,比如200-500毫秒左右?我应该使用javascript计时器控件吗?
答案 0 :(得分:5)
首先,您需要确定是否要限制速率,因为您忽略了在等待期间所做的所有函数调用,或者您是否只想排队请求以确保您永远不会超过每秒X次请求。
如果您想要前一个解决方案(忽略新的功能调用),那么您应该查看http://documentcloud.github.com/underscore/#throttle
如果你想限速,这样你就不会每秒调用你的函数超过X次,但是不要完全失去那些函数调用,那么你需要一个完全不同的解决方案。
我在https://gist.github.com/1084831写了一个下划线扩展名 您可以在http://jsbin.com/upadif/8/edit#preview
看到一个有效的示例答案 1 :(得分:3)
如果自上次调用后经过的时间少于500毫秒,则不允许该函数运行。
(function(window, undefined){
var canCall = true;
window.funcName = function(){
if (!canCall)
return;
//Your function
canCall = false;
setTimeout(function(){
canCall = true;
}, 500);
}
})(window);
答案 2 :(得分:2)
你可以创建一个在调用函数时引发的标志并启动一个计时器,如果这个标志被引发则你不能调用该函数,然后在一定时间后调用计时器并关闭标志,允许你再次调用该函数。
旗帜可以是任何东西,如布尔或其他东西。
答案 3 :(得分:1)
bottleneck和node-rate-limiter之类的库几乎涵盖了所有用例。
答案 4 :(得分:1)
这取决于您要对后续调用执行的操作,要在哪里运行等。
还有服务器端调节器,例如ratelimiter(async-ratelimiter),node-rate-limiter
答案 5 :(得分:0)
我最近在另一个帖子中回答了这个问题:
答案 6 :(得分:0)
你也可以使用SugarJS功能“油门”:
答案 7 :(得分:0)
这取决于您想要的功能。以下是指向具有两项重要功能的网页的链接:https://remysharp.com/2010/07/21/throttling-function-calls
节流:处理第一个呼叫,然后根据阈值调节下一个呼叫(将处理第一个和最后一个呼叫,但只有几个呼叫)
去抖:在没有调用延迟功能之前不要处理任何通话(在通话和相当长时间后只会调用1)答案 8 :(得分:0)
如果您的问题涉及过多的工作,请使用队列:
const work_queue = [];
function queue(message) {
work_queue.push(message)
}
function run() {
const work = work_queue.shift();
if (work !== undefined) {
scan_one(work);
}
}
setInterval(run, 15);
如果您遇到的问题涉及到过于频繁地调用函数:
let last = +new Date();
function run() {
const now = +new Date();
if (now - last > 5000) { // 5 seconds
last = now;
run_once();
}
}
答案 9 :(得分:-1)
fooCanBeCalled = true;
function foo(){
if(!fooCanBeCalled) return;
//Whatever you want to do
fooCanBeCalled = false;
setTimeout(function(){
{
fooCanBecalled = true;
}
, delayInMilliseconds);
}
答案 10 :(得分:-1)
您可以使用去抖功能
function debounce(func, wait, immediate) {
var timeout;
return function() {
var context = this,
args = arguments;
var later = function() {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
};
var logging = debounce(function(){
alert("Heavy task");
}, 5000);
setTimeout(logging, 100);//callback executed after 5 seconds
有关去抖功能如何在此处运行的更多信息http://qnimate.com/javascript-limit-function-call-rate/
答案 11 :(得分:-2)
尝试setinterval(“function()”,500)