我正在寻找一个简单的JavaScript节流阀。我知道像lodash和下划线这样的库都有它,但只有一个函数包含这些库中的任何一个都是多余的。
我还检查了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秒完成时,它仍然会按下第二个键盘。我不希望这种行为。
除了这里的讨论(以及最近的访问者),如果不使用lodash
中几乎事实上的throttle
的原因是为了有一个更小的包或捆绑包,那么可以只在捆绑包中包含throttle
,而不是整个lodash
库。例如,在ES6中,它类似于:
import throttle from 'lodash/throttle';
此外,还有一个名为lodash的
throttle
仅来自lodash的包。节气门
可与ES6中的简单导入
或ES5中的require
一起使用。
这个怎么样?
function throttle(func, timeFrame) {
var lastTime = 0;
return function () {
var now = new Date();
if (now - lastTime >= timeFrame) {
func();
lastTime = now;
}
};
}
易于理解的
你可能有兴趣看看来源。
我会用下划线。js或lodash源代码,以找到此函数经过良好测试的版本。
下面是下划线代码的稍微修改版本,用于删除对下划线的所有引用。js本身:
// Returns a function, that, when invoked, will only be triggered at most once
// during a given window of time. Normally, the throttled function will run
// as much as it can, without ever going more than once per `wait` duration;
// but if you'd like to disable the execution on the leading edge, pass
// `{leading: false}`. To disable execution on the trailing edge, ditto.
function throttle(func, wait, options) {
var context, args, result;
var timeout = null;
var previous = 0;
if (!options) options = {};
var later = function() {
previous = options.leading === false ? 0 : Date.now();
timeout = null;
result = func.apply(context, args);
if (!timeout) context = args = null;
};
return function() {
var now = Date.now();
if (!previous && options.leading === false) previous = now;
var remaining = wait - (now - previous);
context = this;
args = arguments;
if (remaining <= 0 || remaining > wait) {
if (timeout) {
clearTimeout(timeout);
timeout = null;
}
previous = now;
result = func.apply(context, args);
if (!timeout) context = args = null;
} else if (!timeout && options.trailing !== false) {
timeout = setTimeout(later, remaining);
}
return result;
};
};
请注意,如果不需要强调支持的所有选项,则可以简化此代码。
请在下面找到此功能的一个非常简单且不可配置的版本:
function throttle (callback, limit) {
var waiting = false; // Initially, we're not waiting
return function () { // We return a throttled function
if (!waiting) { // If we're not waiting
callback.apply(this, arguments); // Execute users function
waiting = true; // Prevent future invocations
setTimeout(function () { // After a period of time
waiting = false; // And allow future invocations
}, limit);
}
}
}
编辑1:删除了对下划线的另一个引用,thx指向@Zettam的注释
编辑2:在@lolzery@wowzery的评论中添加了关于lodash和可能的代码简化的建议
编辑3:由于流行的请求,我添加了一个非常简单的、不可配置的函数版本,改编自@vsync的注释
问题内容: 我正在寻找JS中的简单节流阀。我知道像lodash和underscore这样的库都有它,但是仅对一个函数来说,包含其中任何一个库都是过大的。 我也在检查jquery是否具有类似的功能-找不到。 我发现一个工作的节流阀,这是代码: 问题是:在油门时间结束后,它将再次触发该功能。因此,假设我制作了一个在按键时每10秒触发一次的油门如果我按键2次,则在完成10秒后仍会触发第二次按键。我不要这
本文向大家介绍JavaScript 中的 this 简单规则,包括了JavaScript 中的 this 简单规则的使用技巧和注意事项,需要的朋友参考一下 几条规则确定函数里的 this 是什么。 想确定 this 是什么其实非常简单。总体的规则是,通过检查它的调用位置,在函数被调用的的时候确定 this。它遵循下面这些规则,接下来以优先级顺序说明。 规则 1、如果在调用函数时使用 new 关键字
现在,我们知道如何去创建一个 Redux 实例,并让它管理应用中的 state下面讲一下这些 reducer 函数是如何转换 state 的。 Reducer 与 Store 区别: 你可能已经注意到,在简介章节中的 Flux 图表中,有 Store,但没有Redux 中的 Reducer。那么,Store 与 Reducer 到底有哪些区别呢? 实际的区别比你想象的简单:Store 可以保存你的
问题内容: 在JavaScript中实现单例模式的最简单/最干净的方法是什么? 问题答案: 我认为最简单的方法是声明一个简单的对象文字: 如果您希望单例实例上有私人成员,则可以执行以下操作: 这就是所谓的模块模式,它基本上可以让你来封装对象私有成员,通过采取利用的优势关闭。 更新: 我想补充一点,如果要防止修改单例对象,可以使用ES5 方法冻结它。 这将使对象不可变,从而防止对其结构和值进行任何修
问题内容: 我正在尝试从Flickr中读取RSS提要,但它具有一些不能被Simple XML读取的节点(,等等)。 我该如何解决?当我查看DOM文档时,我的头很痛。所以我想避免这种情况,因为我不想学习。 我正在尝试获取缩略图。 问题答案: 解决方案在这篇不错的文章中进行了解释。您需要用于访问包含名称空间的XML元素的方法。此代码段摘自该文章:
我想做一个简单的服务器,这样我就可以在开发时为本地html和JS文件服务。 我试图让一个节点应用程序只接受URL中的任何内容,并用页面响应,但没有成功(这是我对express的尝试)。 但这总是在处查找文件,而不是正确的路径。 我也尝试过一个简单的静态服务器的http-server,但它总是在为js文件提供服务时崩溃。https://github.com/nodeapps/http-server