2012-06-11 94 views
2

我有一個功能。它由腳本中的許多其他功能觸發。有時非常迅速,可能幾乎同時防止功能被快速啓動

我怎樣才能防止它在短時間內被迅速觸發?通過設置某種延遲或計時器?我想盡量減少數據庫調用功能

但是,如果不需要,函數應該沒有延遲。含義:First call = no delay。所有其他呼叫=僅在前一次呼叫小於x秒前才延遲。 而如果延遲設置爲假設5秒,該功能只能等待1秒,如果前面的調用在4秒前..希望你明白我的意思;)

function checkusers() { 

    $.ajax({ 
     url: '/checkusers_in_db.php', 
     type: 'POST' 
    }); 

}; 
+0

可能重複[如何防止JQuery中過多的函數調用](http://stackoverflow.com/questions/9861823/how-to-prevent-excessive-function-calls-in-jquery) –

+0

可以使用counter somwthing like var myCall = 0;然後myCall ++;內部函數循環,然後按需要進行操作 – swapnesh

+0

每次都會返回不同的結果嗎?即你能在客戶端緩存結果X秒嗎? – avesse

回答

0

Underscore.js有方法debounce,可幫助這裏

debounce_.debounce(函數,等待,[即時]) 創建並返回傳遞函數的新版本去抖,將推遲執行,直到後等待的毫秒以來已經過去了它最後一次被調用。用於實現只應在輸入停止後纔會發生的行爲。例如:渲染Markdown註釋的預覽,在窗口停止調整大小後重新計算佈局等等。

http://underscorejs.org/#debounce

使用這樣的:

checkusers_with_delay = _.debounce(checkusers, how_much_delay); 

,然後使用checkusers_with_delay在其他功能

+0

排隊並處理請求,這當然要求您在網頁中包含underscore.js,但無論如何它都是一個很棒的庫 – jakee

+0

仔細看,上面記錄的'throttle''功能可以更好地適應帳單 – jakee

0

所有這些衆人你可以考慮Comet模式(長輪詢)

重構checkuse用戶,以便查看用戶緩存而不是通過AJAX調用。由於單獨的代碼片段對AJAX調用進入PHP頁面,該頁面在返回時刷新用戶緩存。

祕訣是PHP可以「持有」HTTP請求,直到它有足夠的數據發送回您的頁面。然後在收到回覆後,您的頁面會發出另一個AJAX請求,並進行沖洗並重復。

-1

這將觸發ajax,如果它沒有在最近30秒內運行。

var last_checkuser_time = new Date(); 

function checkusers() { 

    var now = new Date(); 
    var timeout = now.setSeconds(now.getSeconds() - 30); 
    if (last_checkuser_time < timeout) { 

     $.ajax({ 
      url: '/checkusers_in_db.php', 
      type: 'POST' 
     }); 
     last_checkuser_time = new Date(); 
    } 

}; 
+0

這個隊列是否會調用函數,或者如果最後一次調用的時間少於30秒,就不會運行? – mowgli

+0

忘記我的問題。這看起來不錯。稍後會嘗試;) – mowgli

+0

但是這也會延遲第一次通話嗎? – mowgli

0

我建立我自己的調整大小功能:

  • 防止因保羅愛爾蘭
  • 可以在所有的選擇不只是$(窗口的約束(被解僱過快使用this功能))通過使用this BU本Alman

只需導入這個代碼:

/* 
* jQuery resize event - v1.1 - 3/14/2010 
* http://benalman.com/projects/jquery-resize-plugin/ 
* 
* Copyright (c) 2010 "Cowboy" Ben Alman 
* Dual licensed under the MIT and GPL licenses. 
* http://benalman.com/about/license/ 
*/ 
(function($,sr){ 

    // debouncing function from John Hann 
    // http://unscriptable.com/index.php/2009/03/20/debouncing-javascript-methods/ 
    var debounce = function (func, threshold, execAsap) { 
     var timeout; 

     return function debounced() { 
      var obj = this, args = arguments; 
      function delayed() { 
       if (!execAsap) 
        func.apply(obj, args); 
       timeout = null; 
      }; 

      if (timeout) 
       clearTimeout(timeout); 
      else if (execAsap) 
       func.apply(obj, args); 

      timeout = setTimeout(delayed, threshold || 500); 
     }; 
    } 
    // resize 
    jQuery.fn[sr] = function(fn){ return fn ? this.bind('resize', debounce(fn)) : this.trigger(sr); }; 

})(jQuery,'resize'); 

然後導入Ben Alman resize()事件。