我有一个功能。它是由脚本中的许多其他函数触发的。有时很快,也许几乎同时
如何防止短时间内触发太快?通过设置某种延迟或计时器?我想最小化函数正在进行的数据库调用
但是如果不需要,函数应该没有延迟。意思是:第一次调用=没有延迟。所有其他呼叫=仅在前一次呼叫小于x秒之前延迟。 如果将延迟设置为让我们说5秒,那么如果之前的呼叫是在4秒前完成的,那么该功能应该只等待1秒钟。希望你理解我的意思;)
function checkusers() {
$.ajax({
url: '/checkusers_in_db.php',
type: 'POST'
});
};
答案 0 :(得分:0)
Underscore.js有方法debounce
,这可能会有所帮助
debounce_.debounce(功能,等待,[立即]) 创建并返回已传递函数的新debounced版本,该函数将推迟执行,直到自上次调用之后经过等待毫秒。用于实现仅在输入停止到达后才会发生的行为。例如:渲染Markdown注释的预览,在窗口停止调整大小后重新计算布局,等等。
http://underscorejs.org/#debounce
像这样使用:
checkusers_with_delay = _.debounce(checkusers, how_much_delay);
然后在所有其他函数中使用checkusers_with_delay
答案 1 :(得分:0)
你可以考虑COMET模式(长轮询)
重构checkusers所以它会查看你的用户缓存而不是通过AJAX调用。作为一段单独的代码,在PHP页面中有一个AJAX调用,返回时会刷新用户缓存。
秘诀是PHP可以“保留”HTTP请求,直到它有一些/足够的数据发送回您的页面。然后收到回复后,您的页面会发出另一个AJAX请求,然后冲洗并重复。
答案 2 :(得分:0)
我建立了自己的调整大小功能:
只需导入此代码:
/*
* 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()事件。
答案 3 :(得分:-1)
如果ajax在最后30秒内没有运行,这将触发ajax。
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();
}
};