[英]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对其进行call
或apply
强制执行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.