2

我有一个功能。它是由脚本中的许多其他函数触发的。有时非常迅速,可能几乎同时

如何防止它在短时间内过快触发?通过设置某种延迟或计时器?我想最小化函数正在进行的数据库调用

但是如果不需要,函数应该没有延迟。含义:第一次调用=没有延迟。所有其他呼叫 = 仅在先前呼叫少于 x 秒前时才延迟。如果延迟设置为 5 秒,如果上一次调用是在 4 秒前进行的,该函数应该只等待 1 秒。希望你明白我的意思;)

function checkusers() {

    $.ajax({
        url: '/checkusers_in_db.php',
        type: 'POST'
    });

};
4

4 回答 4

0

我构建了自己的调整大小函数:

  • 通过 Paul Irish使用来防止函数被过快触发
  • 可以使用这个bu Ben Alman绑定到所有选择器(不仅仅是 $(window))

只需导入此代码:

/*
 * 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() 事件。

于 2013-06-24T15:10:38.833 回答
0

Underscore.js 有方法debounce,在这里可能会有所帮助

debounce_.debounce(function, wait, [immediate]) 创建并返回传递函数的新去抖动版本,该版本将推迟其执行,直到自上次调用以来等待毫秒过去后。对于实现仅在输入停止到达后才应发生的行为很有用。例如:渲染 Markdown 注释的预览,在窗口停止调整大小后重新计算布局等等。

http://underscorejs.org/#debounce

像这样使用:

checkusers_with_delay = _.debounce(checkusers, how_much_delay);

然后checkusers_with_delay在所有其他众多功能中使用

于 2012-06-11T12:24:29.030 回答
0

您可以考虑 COMET 模式(长轮询)

重构 checkusers,使其查看您的用户缓存而不是通过 AJAX 调用。作为单独的一段代码,对 PHP 页面有一个 AJAX 调用,返回时会刷新您的用户缓存。

秘诀是 PHP 可以“保留”HTTP 请求,直到它有一些/足够的数据发送回您的页面。然后在收到响应后,您的页面会发出另一个 AJAX 请求,冲洗并重复。

于 2012-06-11T12:24:32.813 回答
-1

如果在过去 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();
    }

};
于 2012-06-11T12:24:52.233 回答