【问题标题】:Debounce function with args underscore带 args 下划线的去抖动功能
【发布时间】:2014-07-14 12:20:42
【问题描述】:

我有一个接受一些参数的函数。但是下划线去抖动的用法是:

var lazyLayout = _.debounce(calculateLayout, 300);

但就我而言,calculateLayout 需要一些参数才能运行。在这种情况下我怎样才能通过它们?

更新:

示例calculateLayout 函数:

var calculateLayout = function(a,b) {
  console.log('a is ' + a + ' and b is ' + b);
}

【问题讨论】:

  • 对此不完全确定,因为我还没有完全适应下划线,但如果 calculateLayout 是一个函数,那么在匿名函数中传递带有 args 的函数。还是您已经尝试过?
  • 呃,the debounce function 是否传递给定的论点?只需致电lazyLayout('a', 'b')
  • @Gandalf StormCrow,也许你不应该接受我的回答,因为它不是最优雅的解决方案,但只要它被接受,我就不能删除它

标签: javascript underscore.js


【解决方案1】:

你应该可以只使用一个匿名函数作为第一个参数,然后在其中调用你喜欢的任何东西:

_.debounce(function(){
    calculateLayout(20, 30);
}, 300);

【讨论】:

  • 这正是我在评论中的意思。如果可行,那就完美了。
  • 此外,此方法将多次调用内部函数,并且只在每次调用时应用去抖动,而不是需要的单个调用。 This site explains it all.
  • 正如@JakeGould 提到的,这只会创建 3 个去抖动的函数,这些函数被分配给任何内容,并且不会被调用。
【解决方案2】:

@Jamie 的回答更好。

我将保留我的原始答案如下,但如果您熟悉 JS,最好使用 Jamie 的答案:

var calculateLayout = function(a,b) {
  console.log('a is ' + a + ' and b is ' + b);
}

var debounceCalculate = _.debounce(function(a, b){
    calculateLayout(a, b);
}, 300);

debounceCalculate(1, 2);

【讨论】:

  • 呃...var debounceCalculate = _.debounce(calculateLayout, 300); 就足够了
  • @BradKent 谢谢!因为 Jaime 已经回答了,所以我会保持今天的状态。
  • @jacobhobson 真的不知道你为什么要这样做。首先,我在詹姆回答之前回答了。其次,我觉得我的回答对那些没有很快想到args可以省略的JS初学者有所帮助。
【解决方案3】:

中间不需要匿名函数,运行去抖动版本时,参数会自动传递给原始函数

  var debounceCalculate = _.debounce(calculateLayout, 300);
  debounceCalculate(a,b);

作为一个优势,您不必提前硬编码绑定参数

您可以尝试一下,如果好奇,请查看source

【讨论】:

  • 这是个好消息。谢谢你。我很难理解为什么这里没有将 debounceCalculate 声明为函数,而只是分配了 debounce 函数,并且仍然像一个函数一样工作,并且能够接受参数并且知道这些参数是用于 debounce 中的内部函数的。为什么会这样?
  • 如果您查看_.debounce 的源代码,您会注意到它返回的是function。这就是函数式编程的力量,而 Js 也包含其中的一部分:)
【解决方案4】:

由于没有人在没有额外的varfunction 的情况下编写一个班轮,我会自己做:

_.debounce(calculateLayout, 300)(a, b);

Debounce 函数返回另一个函数,因此您可以在 debounce 执行后调用它。

【讨论】:

  • 完全违背去抖的目的
  • 这不是错了吗?我将它完全设置为一个事件处理程序(例如 onClick),它根本没有去抖动。如果您将此设置为事件处理程序,它将始终创建去抖动函数的新实例
最近更新 更多