Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何对ajax请求进行分级限制?_Javascript_Jquery - Fatal编程技术网

Javascript 如何对ajax请求进行分级限制?

Javascript 如何对ajax请求进行分级限制?,javascript,jquery,Javascript,Jquery,有几个div和handler可以在单击时发送ajax请求。我的问题是,我不知道如何强制我的处理程序不超过每30秒1个请求的限制 谢谢你的帮助 创建一个布尔canFireRequest或其他标记,并在每次ajax请求后将其设置为false。然后创建一个30秒的时间跨度,将其设置回true;在每个新请求之前检查标志的值 下面是一个粗略的例子: if ($(this).data('canFireRequest')) { // Ajax request goes here $(this)

有几个div和handler可以在单击时发送ajax请求。我的问题是,我不知道如何强制我的处理程序不超过每30秒1个请求的限制


谢谢你的帮助

创建一个布尔canFireRequest或其他标记,并在每次ajax请求后将其设置为false。然后创建一个30秒的时间跨度,将其设置回true;在每个新请求之前检查标志的值

下面是一个粗略的例子:

if ($(this).data('canFireRequest')) {
    // Ajax request goes here
    $(this).data('canFireRequest', false);
}

setTimeout(function() {
    $(this).data('canFireRequest', true)
}, 30000);
该发动机具有油门功能。您传入要限制的处理程序,并返回同一函数的速率限制版本

var throttled = _.throttle(someHandler, 100);
$(div).click(throttled);

以下是我在自己的代码中使用的简化版本:

function throttle(func, wait) {
    var timeout;
    return function() {
        var context = this, args = arguments;
        if (!timeout) {
            // the first time the event fires, we setup a timer, which 
            // is used as a guard to block subsequent calls; once the 
            // timer's handler fires, we reset it and create a new one
            timeout = setTimeout(function() {
                timeout = null;
                func.apply(context, args);
            }, wait);
        }
    }
}
测试它的一个好方法是触发一系列滚动事件,并观察处理程序记录到Firebug控制台:

document.addEventListener("scroll", throttle(function() {
    console.log("test");
}, 2000), false); 
以下是一个版本,它将
div
s上的单击事件限制为每30秒一次(需要jQuery):


如果您想限制速率,那么不幸的是,下划线.js提供的u.throttle方法不是您的解决方案。Throttle只会确保调用方法的时间不会超过X秒,因此在该时间段结束之前,将忽略所有后续函数调用

如果您想限制速率,使调用函数的次数不会超过每秒X次,但不会完全丢失这些函数调用,那么您需要一个完全不同的解决方案

我在上写了一个下划线扩展名


您可以在

中看到一个工作示例,setTimeout的第二个参数应为30000,持续30秒,即guess@unclenorton真的!固定的!这不是一个很好的解决方案,因为它不会对速率受限的请求进行排队,它只会忽略在指定时间内出现的任何请求。@Mathew,问题没有指出是否需要对后续请求进行排队,或者干脆忽略它们。这是否是一个好的解决方案取决于您的需要。例如,SO允许您每5秒进行一次评论投票。他们不会对随后的投票请求排队。它们只是忽略它们并向您提供错误消息。同样,这取决于您的需要。+1对于下划线用户来说是一个很好的解决方案。我也强烈建议使用下划线。或者,如果因为没有传递事件处理程序而需要直接调用它,请不要忘记这样调用它:throttle(function(){//ajax here},30000)(;)。throttle用于在指定的时间内限制函数调用的数量。如果您想对请求进行分级限制,即排队,并确保它们仅每X秒运行一次,那么您需要另一种解决方案(在我的回答中提供)
节流通常是您想要的。在事件发生后很长一段时间内排队等待一系列事件驱动回调执行的用例是什么?太棒了。还要研究一下u.debounce()-对于我类似的、相关的用于搜索输入的回调函数的情况,它更好。我怀疑这不是OP所要求的,而是一个有趣的插件的+1。谢谢——这就是我一直在寻找的。(用例是基于单个用户操作触发对第三方速率受限API的多个查询。)
$("div").click(throttle(function() {
    // ajax here
}, 30000));