2013-12-20 32 views
0

在_.debounce()中檢查參數值的方法是什麼?如何根據參數值_.debounce()?

var renderPage = _.debounce(function(pageNo){ 
    // render code for page=pageNo immediately, then 
    // debounce repeated calls for the SAME pageNo 
    // but a DIFFERENT pageNo would have a different debounce setTimeout() 
}, 1000, true) 

renderPage(1); // render immediate 
renderPage(1); // debounced 
renderPage(2); // render immediate 
renderPage(2); // debounced 

回答

1

在這裏很好的答案,但另一種可能性是memoization。例如:

var renderPage = function (pageNo) { 
    renderPage._pageNos = renderPage._pageNos || {}; 
    if (!(pageNo in renderPage._pageNos)) { 
     renderPage._pageNos[pageNo] = _.debounce(function() { 
      // Do renderPage() work here 
     }, 1000, true); 
    } 
    renderPage._pageNos[pageNo](); 
} 

JSFiddle demonstration

+1

我從不1)理解記憶,或2)知道你可以添加屬性到一個函數。但下劃線有一個_.memoize()函數,我最終使用它來存儲_.debounce()函數。 – michael

0

也許這樣?

var debouncer = function(func, timer){ 
    return _.debounce(func, timer, true); 
} 

var renderPage = function(num){ 


} 

var renderPage1 = debouncer(renderPage, 1000); 
var renderPage2 = debouncer(renderPage, 2000); 

好了怎麼樣的線沿線的東西:

var rp = function(num){ 
    //actual render page code here 
} 

var renderPage = function(num, timer){ 
    if(typeof(this[num]) === "undefined"){ 
     this[num] = _.debounce(rp, timer, true); 
    } 
    this[num](num); 
} 
+0

我試圖避免每個頁面的新功能。頁數是不確定的 – michael

0

這是一個可能的解決方案?我回到了下劃線的源頭。我認爲你需要跟蹤不同的setTimeout調用來完成任務。有沒有更通用的方法來保持定時器arg'靜態'的地方?

_.debounceByArgs = function(func, wait, immediate, timers) { 
     var timeout = timers || {}; 
     return function() { 
      var context = this, args = arguments; 
      var id = JSON.stringify(args); 
      var later = function() { 
       timeout[id] = null; 
       if (!immediate) func.apply(context, args); 
      }; 
      var callNow = immediate && !timeout; 
      clearTimeout(timeout[id]); 
      timeout[id] = setTimeout(later, wait); 
      if (callNow) func.apply(context, args); 
     }; 
    };