更新:我现在知道节流阀会减少过多的函数调用,所以它不是正确的工具。我仍然希望采用一种惯用的方式来处理队列中的所有项目,而不需要太快地执行或删除任何项。
我正在编写一个节点应用程序,它的访问API有一个速率限制。我可以比我被允许发送的速度快得多。我想使用一个队列的呼叫,但不要走得太快或放弃任何一个。我做了一个小的类型脚本测试来说明我的问题:
import * as _ from "lodash";
let start = new Date().getTime();
function doLog(s: string) {
let elapsed = new Date().getTime() - start;
console.log(`${s} ${elapsed}`);
}
let array = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'];
let throttled = _.throttle(doLog, 100);
array.forEach(s => throttled(s));我希望看到的输出大致如下:
a 2
b 101
c 203
d 302
e 405
f 502
g 603
h 706
i 804
j 902但我看到的是:
a 2
j 101我做了一些奇怪的观察:
发布于 2016-06-01 18:05:00
如果您不关心在调用下一个doLog()之前安全地“完成”,则只需使用setTimeout
let array = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'];
array.forEach((s, i) => setTimeout(doLog, i*100, s));Adam很好地解释了为什么throttle在这种情况下不好。
发布于 2016-06-01 17:33:12
如果在等待期间多次调用节流函数,则忽略后续调用。如果您需要处理数组中的每个项,那么throttle()可能不是您想要的。例如,它更适合于防止UI中的过度更新。
您总是在输出中看到a和j的原因是由于前缘和后缘。整个数组在不到100 was的时间内被处理,但是由于前导和尾部默认为true,您将看到这两个调用(对节流函数的第一次调用和最后一次调用)。
发布于 2016-06-01 18:00:47
如果您愿意使用RxJS,这个答案会让您非常愚蠢地实现这一点:
https://stackoverflow.com/questions/37573521
复制相似问题