繁体   English   中英

对使用_.throttle的.apply方法进行速率限制

[英]Rate limiting an .apply method with _.throttle

是否可以对诸如this[act].apply(this, data)类的东西进行速率限制,抑制或反跳? 带下划线或其他内容? 我尝试了很多东西,例如

_.throttle(/* different permutations of combined args */)

_.throttle.apply(/* same */)

_.throttle.apply(myArgs)(throttleArgs)

_.throttle(throttleArgs).apply(myArgs)

某些产生错误,某些冻结执行以及某些使用(没有限制的范围和参数,但没有节流)调用apply方法。 有任何想法吗? 使用CoffeeScript和这些是类方法。

由于您正在调用原始功能

this[act].apply(this, data)

使用this ,我假设您正在从对象的方法内调用它。 现在的问题,如何让this从这里到那里? 许多高阶函数被设计成访问具有相同的底层函数this他们自己是调用,使用下面的一种骨架:

function higher_order_function(fn) {
  return function() {
    return fn.apply(this, arguments);
  };
}

这意味着,如果我有一个带有方法的对象

var obj = {
  val: 42,
  print: function() { console.log(this.val); }
}

然后我要转换print功能:

obj.newPrint = higher_order_function(obj.print);

我现在可以调用obj.newPrint ,和下方, this将被用来调用print ,一切按预期工作。

对于此类事物,存在替代设计,涉及显式传递上下文( this )并将其作为函数的单独参数提供,但上述方法通常更简洁,更“合理”。

这就是_.throttle工作方式。 如果您查看源代码,就会发现它在执行以下操作

return function() {
  ...
  context = this;
  args = arguments;
  ...
  result = func.apply(context, args);
};

这意味着,要以节制的方式调用代码,只需要做的就是用this来调用它。

假设您要调用的原始代码在一个名为act的函数中。

var obj = {
  act: function(act) {
    this[act].apply(this, data);
  }
};

要制作act的受限版本(在这里,我们将其直接放在对象上;您可以通过将其放在原型上来完成类似的操作,请参见下文):

obj.throttledAct = _.throttle(obj.act);

然后只需致电

obj.throttledAct('act1')

如果您使用原型进行编程:

Foo.prototype.func = function(act) { this[act].apply(this, data) };

然后,您可以使用以下命令将受限制的版本放在原型上:

Foo.prototype.throttledFunc = _.throttle(Foo.prototype.func);

一切都会按预期进行。

如果出于某种原因要创建受限制函数的独立版本,而不将其放入对象或原型中,请执行以下操作:

var throttledFunc = _.throttled(func);

然后,您可以通过call对其进行callapply强制执行this

throttledFunc.call(obj, 'act1`);

但无论哪种情况,参数'act1'如何传递给基础函数。 这也是通过_.throttle的实现中的_.throttle行完成的,该_.throttle读取

result = func.apply(context, args);

在这里, args是传递给_.throttle构造的函数的_.throttle ,并且apply用来将它们与this一起传递给基础函数。 请注意, _.throttle本身还需要将其他参数传递给基础函数,但是_.throttle它们“烧入”,而不是在每次调用受限制的函数时都指定它们。

你的尝试

_.throttle(/* different permutations of combined args */)
_.throttle.apply(/* same */)
_.throttle.apply(myArgs)(throttleArgs)
_.throttle(throttleArgs).apply(myArgs)

所有这些都遭受相同的问题,即必须向_.throttle 传递要进行限制的函数,然后返回一个函数,然后调用该函数以获得限制的行为。 最后一个可能是最接近的,并假设throttleArgs是要油门的函数,而myArgs实际上是this, myArgs

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM