Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用节流阀的速率限制应用方法_Javascript_Function_Methods_Underscore.js_Throttling - Fatal编程技术网

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)