我正在寻找 JavaScript 中的简单节流阀。我知道像 lodash 和 underscore 这样的库有它,但只有一个功能,包含这些库中的任何一个都太过分了。
我也在检查 jQuery 是否具有类似的功能 - 找不到。
我找到了一个工作油门,这是代码:
function throttle(fn, threshhold, scope) {
threshhold || (threshhold = 250);
var last,
deferTimer;
return function () {
var context = scope || this;
var now = +new Date,
args = arguments;
if (last && now < last + threshhold) {
// hold on to it
clearTimeout(deferTimer);
deferTimer = setTimeout(function () {
last = now;
fn.apply(context, args);
}, threshhold);
} else {
last = now;
fn.apply(context, args);
}
};
}
这个问题是:它在节流时间完成后再次触发该功能。所以让我们假设我做了一个油门,在按键时每 10 秒触发一次——如果我按键 2 次,它仍然会在 10 秒完成后触发第二次按键。我不想要这种行为。
原文由 Mia 发布,翻译遵循 CC BY-SA 4.0 许可协议
我会使用 underscore.js 或 lodash 源代码来找到此功能的经过良好测试的版本。
这是下划线代码的略微修改版本,用于删除对 underscore.js 本身的所有引用:
请注意,如果您不需要所有下划线支持的选项,则可以简化此代码。
请在下面找到此功能的一个非常简单且不可配置的版本:
编辑 1:删除了另一个对下划线的引用,感谢@Zettam 的评论
编辑 2:添加了关于 lodash 和可能的代码简化的建议,感谢 @lolzery @wowzery 的评论
编辑 3:由于普遍要求,我添加了一个非常简单的、不可配置的函数版本,改编自@vsync 的评论