Javascript 使用节流阀的速率限制应用方法
是否有可能限制、限制或消除类似于Javascript 使用节流阀的速率限制应用方法,javascript,function,methods,underscore.js,throttling,Javascript,Function,Methods,Underscore.js,Throttling,是否有可能限制、限制或消除类似于此[动作]的波动。应用(此,数据)?用下划线还是别的什么?我试过很多东西,比如 \节流阀(/*组合参数的不同排列*/) \节流阀。应用(/*相同*/) 节流阀应用(myArgs)(节流阀轴承) \u.throttleArgs(throttleArgs).apply(myArgs) 有些产生错误,有些冻结执行,有些调用apply方法(正确的作用域和参数,但没有限制)。有什么想法吗?使用CoffeeScript,这些是类方法。因为您调用的是原始函数 this[act]
此[动作]的波动。应用(此,数据)
?用下划线还是别的什么?我试过很多东西,比如
\节流阀(/*组合参数的不同排列*/)
\节流阀。应用(/*相同*/)
节流阀应用(myArgs)(节流阀轴承)
\u.throttleArgs(throttleArgs).apply(myArgs)
有些产生错误,有些冻结执行,有些调用apply方法(正确的作用域和参数,但没有限制)。有什么想法吗?使用CoffeeScript,这些是类方法。因为您调用的是原始函数
this[act].apply(this, data)
使用此
,我假设您是从对象的方法中调用它。问题是,如何从这里到那里获取此?许多高阶函数被设计为使用与调用它们自身相同的this
调用基础函数,使用以下类型的框架:
function higher_order_function(fn) {
return function() {
return fn.apply(this, arguments);
};
}
这意味着,如果我有一个带有方法的对象
var obj = {
val: 42,
print: function() { console.log(this.val); }
}
然后我想转换打印
功能:
obj.newPrint = higher_order_function(obj.print);
我现在可以调用obj.newPrint
,在下面,这个
将被用来调用打印
,一切正常
对于这类事情有其他的设计方案,包括明确地传递上下文(这个
),并将它们作为单独的函数参数提供,但上述方法通常更简洁且“有效”
这就是节流阀的工作原理。如果你看源代码,你会发现它在做
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('act1')
如果您使用原型编程:
Foo.prototype.func = function(act) { this[act].apply(this, data) };
然后,您可以使用以下方法在原型上设置限制版本:
Foo.prototype.throttledFunc = _.throttle(Foo.prototype.func);
一切都会按预期进行
如果出于某种原因,您希望创建受限制函数的独立版本,而不将其放入对象或原型中:
var throttledFunc = _.throttled(func);
然后,您可以使用call
或apply
调用它,以强制此
的值:
throttledFunc.call(obj, 'act1`);
但是在这两种情况下,参数'act1'
是如何传递给底层函数的。这也可以通过节流阀实现中的一行来实现
result = func.apply(context, args);
这里的args
是传递给由\uU9>构造的函数的参数。throttle
,而apply
用于将参数连同this
一起传递给基础函数。请注意,\ throttle
本身也会将其他参数传递给基础函数,但这会“烧掉它们”,而不是在每次调用throttled函数时都指定它们
你的尝试
所有这些都有相同的问题,那就是。
必须传递一个要被限制的函数,并返回一个函数,然后调用该函数以获得限制的行为。最后一个可能是最接近的,假设throttleArgs
是要限制的函数,myArgs
实际上是这个,myArgs
感谢您的全面回答!在一些事情中,所以我等着接受它,直到我回来解决这个问题。对于上下文,我使用CoffeeScript,这些是类方法。
result = func.apply(context, args);
_.throttle(/* different permutations of combined args */)
_.throttle.apply(/* same */)
_.throttle.apply(myArgs)(throttleArgs)
_.throttle(throttleArgs).apply(myArgs)