1. 程式人生 > >寫一個限制執行次數的函數

寫一個限制執行次數的函數

用戶 調用 question 好的 就是 不想 窗口 str elf

前言:當監聽窗口的下拉事件或者輸入框的輸入事件時,會頻繁的觸發所監聽的函數,我們並不想如此頻繁的執行那些我們定義的函數,這樣會造成一些不好的用戶體驗,接下來我們就開始解決這個問題

原理分析1:假如我們定義的監聽函數名字是fun,那麽問題的實質就是fun這個函數會被在短時間內調用多次,那麽這樣的話我們可以想到的是在每次將要調用fun函數時記錄下當下的時間戳,不要立刻執行這個函數,而是設置一個定時器,在500毫秒之後再執行,同時再判斷如果兩次觸發的時間間隔小於500毫秒那麽就意味著上一次觸發時的fun函數還沒有被調用觸發時刻又到了,所以clear掉上次的定時器,當然本次觸發也是在500毫秒之後再執行fun函數。

原理1代碼:

一些初始值:

data: {
      question: ‘‘,
      i: 0,
      last: 0,
      timeP: 0
    },

代碼如下:

      question: function(val) {
        var now = Date.now();
        var self = this;
        if (now - this.last < 500) {
          clearTimeout(this.timeP);
        }
        this
.timeP = setTimeout(function (){ self.ajax(); }, 500); this.last = now; }

代碼執行結果:在這種情況下,我們會發現當頻繁的觸發(兩次之間的間隔在500毫秒)fun函數時,只有最後一次觸發會執行fun函數

但是,我們又有了一個新的需求:我們並不想在頻繁的觸發這段時間內只有最後一次觸發會成功,我們想在頻繁的觸發這段時間每500毫秒執行一次(第一次和最後一次都要被執行到)。

這時我們的代碼就成為了:

      question: function
(val) { var now = Date.now(); var self = this; if (now - this.last < 500) { clearTimeout(this.timeP); this.timeP = setTimeout(function (){ this.last = now; self.ajax(); }, 500); } else { this.last = now; self.ajax(); } }

這樣寫更好

      question: function(val) {
        var self = this;
        var now = Date.now();
        clearTimeout(self.timeP);
        if (now - self.last > 1000) {
          self.ajax();
          self.last = now;
        } else {
          self.timeP = setTimeout(function () {
            self.ajax();
            self.last = now;
          }, 500);
        }
      } 

寫一個限制執行次數的函數