2010-05-27 18 views
14

Tôi có một hàm JavaScript thực sự kết thúc bằng cách thực hiện cuộc gọi phía máy chủ. Tôi muốn giới hạn tốc độ mà chức năng này có thể được gọi.Làm cách nào để tôi có thể xếp hạng giới hạn chức năng javascript cho phép chính nó được gọi là bao nhiêu?

Cách dễ dàng để tôi có thể giới hạn tốc độ hàm javascript của tôi sẽ được gọi bằng cách nói 200-500 mili giây hoặc lâu hơn? Tôi có nên sử dụng điều khiển hẹn giờ javascript không?

Trả lời

2

Bạn có thể tạo cờ được nâng lên khi chức năng được gọi và bắt đầu hẹn giờ và nếu cờ này được nâng lên thì bạn không thể gọi hàm, sau một thời gian nhất định, hẹn giờ được gọi và tắt gắn cờ, cho phép bạn gọi lại hàm.

Cờ có thể là bất kỳ thứ gì, như bool hay gì đó.

-2

thử setInterval ("function()", 500)

+0

Điều này gọi hàm cứ mỗi 500ms, nhưng theo hiểu biết của tôi, Hendo không không muốn gọi hàm cứ mỗi 500ms.Chỉ có khả năng làm như vậy. – hora

+0

Tôi hiểu lầm, tôi xấu – Jose

2

này sẽ không cho phép các chức năng để chạy nếu ít hơn 500 mili giây đã trôi qua kể từ cuộc gọi cuối cùng.

(function(window, undefined){ 
    var canCall = true; 
    window.funcName = function(){ 
     if (!canCall) 
      return; 
     //Your function 
     canCall = false; 
     setTimeout(function(){ 
      canCall = true; 
     }, 500); 
    } 
})(window); 
0
fooCanBeCalled = true; 
function foo(){ 
    if(!fooCanBeCalled) return; 
    //Whatever you want to do 
    fooCanBeCalled = false; 
    setTimeout(function(){ 
     { 
     fooCanBecalled = true; 
     } 
    , delayInMilliseconds); 
} 
+0

Ông đã đăng nó sau và mã của ông cho thấy một biến toàn cầu và vẫn nhận được +1? -____- –

5

Trước tiên, bạn cần thiết lập nếu bạn muốn đánh giá giới hạn trong đó bạn bỏ qua tất cả các cuộc gọi chức năng đó được thực hiện trong khoảng thời gian bạn đang chờ đợi hoặc bạn muốn đơn giản xếp hàng các yêu cầu để đảm bảo bạn không bao giờ thực hiện nhiều hơn yêu cầu X mỗi giây.

Nếu bạn muốn các giải pháp cũ (bỏ qua các cuộc gọi chức năng mới), sau đó bạn nên xem xét http://documentcloud.github.com/underscore/#throttle

Nếu bạn muốn đánh giá giới hạn do đó bạn không bao giờ gọi chức năng của bạn hơn X lần mỗi giây, nhưng don' mất tất cả các cuộc gọi chức năng, sau đó bạn cần một giải pháp hoàn toàn khác.

Tôi đã viết một phần mở rộng gạch tại https://gist.github.com/1084831 Bạn có thể thấy một ví dụ làm việc tại http://jsbin.com/upadif/8/edit#preview

-1

Bạn có thể sử dụng chức năng debounce

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 

Thông tin thêm về cách đánh giá chức năng điện tử hoạt động ở đây http://qnimate.com/javascript-limit-function-call-rate/

0

Loại tùy thuộc vào chức năng bạn muốn. Đây là liên kết đến một trang có 2 chức năng tuyệt vời: https://remysharp.com/2010/07/21/throttling-function-calls

ga: cuộc gọi đầu tiên quá trình, sau đó thực hiện cuộc gọi tiếp theo dựa trên cuộc gọi (cuộc gọi đầu tiên và cuối cùng sẽ được xử lý, nhưng chỉ có một vài cuộc gọi ở giữa)

debounce: không xử lý bất kỳ cuộc gọi nào cho đến khi chức năng không được gọi cho một sự chậm trễ (chỉ 1 sẽ được gọi sau một cuộc gọi và thời gian khá)

Các vấn đề liên quan