防止函数触发得太快
Prevent a function from being fired too rapidly
我有一个函数。它由脚本中的许多其他函数触发。有时非常快,也许几乎同时
如何防止它在短时间内被过快触发?通过设置某种延迟或计时器?我想尽量减少函数正在进行的数据库调用
但是,如果不需要,该功能应该没有延迟。意思是:第一次调用=没有延迟。所有其他调用 = 仅当上一次调用小于 x 秒时延迟。如果延迟设置为 5 秒,则如果上一次调用是在 4 秒前进行的,则该函数应该只等待 1 秒。希望你明白我的意思;)
function checkusers() {
$.ajax({
url: '/checkusers_in_db.php',
type: 'POST'
});
};
下划线.js有方法debounce
,在这里可能会有所帮助
debounce_.去抖动(功能,等待,[立即]) 创建并返回所传递函数的新去抖版本,该版本将推迟其执行,直到自上次调用该函数以来经过等待毫秒之后。对于实现仅在输入停止到达后才应发生的行为很有用。例如:呈现 Markdown 注释的预览,在窗口停止调整大小后重新计算布局,等等。
http://underscorejs.org/#debounce
像这样使用:
checkusers_with_delay = _.debounce(checkusers, how_much_delay);
然后在所有其他函数中使用该checkusers_with_delay
您可以考虑 COMET 模式(长轮询)
重构用户检查,使其查看用户缓存,而不是通过 AJAX 调用。作为一段单独的代码,在 PHP 页面中有一个 AJAX 调用,该调用在返回时刷新您的用户缓存。
秘诀在于 PHP 可以"保留"HTTP 请求,直到它有一些/足够的数据发送回您的页面。然后在收到响应后,您的页面发出另一个 AJAX 请求,冲洗并重复。
我构建了自己的调整大小函数:
- 防止函数通过使用此函数过快触发 作者:Paul Irish
- 可以使用这个bu绑定到所有选择器(不仅仅是$(窗口))上 本·阿尔曼
只需导入此代码:
/*
* jQuery resize event - v1.1 - 3/14/2010
* http://benalman.com/projects/jquery-resize-plugin/
*
* Copyright (c) 2010 "Cowboy" Ben Alman
* Dual licensed under the MIT and GPL licenses.
* http://benalman.com/about/license/
*/
(function($,sr){
// debouncing function from John Hann
// http://unscriptable.com/index.php/2009/03/20/debouncing-javascript-methods/
var debounce = function (func, threshold, execAsap) {
var timeout;
return function debounced () {
var obj = this, args = arguments;
function delayed () {
if (!execAsap)
func.apply(obj, args);
timeout = null;
};
if (timeout)
clearTimeout(timeout);
else if (execAsap)
func.apply(obj, args);
timeout = setTimeout(delayed, threshold || 500);
};
}
// resize
jQuery.fn[sr] = function(fn){ return fn ? this.bind('resize', debounce(fn)) : this.trigger(sr); };
})(jQuery,'resize');
然后导入 Ben Alman resize() 事件。
如果 ajax 在过去 30 秒内未运行,这将触发它。
var last_checkuser_time = new Date();
function checkusers() {
var now = new Date();
var timeout = now.setSeconds(now.getSeconds() - 30);
if (last_checkuser_time < timeout) {
$.ajax({
url: '/checkusers_in_db.php',
type: 'POST'
});
last_checkuser_time = new Date();
}
};
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 将函数的上下文应用于javascript变量
- 如何在JavaScript中将字符串转换为函数引用
- 用嵌套函数和默认函数定义函数
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 无法导出函数expressjs/requestjs中的变量
- 函数参数中的数据与指定变量之间的任何性能差异
- JQuery合并了keyup和focusout两个函数
- ES6构造函数返回基类的实例
- 监视函数从服务返回不起作用,但作用域函数起作用
- 我可以在json对象中添加一个函数吗
- AngularJS:我可以跳过函数参数回调吗
- 如何使jQuery插件函数可调用以供独立使用,而不在集合上操作
- JavaScript数组排序(函数)用于对表行进行排序,而不是排序
- jquery点击函数select&取消选择
- 拨打'父亲'函数形式a'儿童'ReactJS中的组件
- Node.js v6.2.0类扩展不是函数错误
- 比较从函数和生成的日期对象
- jQuery中是否内置了任何字符串格式化函数
- 当js函数's已执行