2013-12-20 84 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); 
     }; 
    };