如何限制javascript函数允许自己被调用的速度?

时间:2010-05-27 19:43:34

标签: javascript

我有一个JavaScript函数,实际上最终会进行服务器端调用。我想限制调用此函数的速率。

什么是一种简单的方法我可以限制我的javascript函数调用的速度,比如200-500毫秒左右?我应该使用javascript计时器控件吗?

12 个答案:

答案 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)

bottlenecknode-rate-limiter之类的库几乎涵盖了所有用例。

答案 4 :(得分:1)

这取决于您要对后续调用执行的操作,要在哪里运行等。

还有服务器端调节器,例如ratelimiterasync-ratelimiter),node-rate-limiter

答案 5 :(得分:0)

我最近在另一个帖子中回答了这个问题:

How to rate-limit ajax requests?

答案 6 :(得分:0)

你也可以使用SugarJS功能“油门”:

http://sugarjs.com/api/Function/throttle

答案 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)