如何设置计时器以防止重叠 ajax 调用?

Posted

技术标签:

【中文标题】如何设置计时器以防止重叠 ajax 调用?【英文标题】:How do I set up a timer to prevent overlapping ajax calls? 【发布时间】:2010-09-17 03:41:54 【问题描述】:

我有一个页面,其中搜索结果显示在网格和地图上(使用动态生成的 KML,覆盖在嵌入式 Google 地图上)。我已经将它连接起来以在用户输入时工作;这是我的代码的骨架,它有效:

$(function() 
    // Wire up search textbox
    $('input.Search').bind("keyup", update);
);

update = function(e) 
    // Get text from search box
    // Pass to web method and bind to concessions grid
    $.ajax(  
        ...
        success: function(msg) 
            displayResults(msg, filterParams);
        ,
    );



displayResults = function(msg, filterParams) 
        // Databind results grid using jTemplates
        // Show results on map: Pass parameters to KML generator and overlay on map

根据搜索的不同,可能会有数百个结果;因此,displayResults 中发生的工作在服务器(查询数据库,即时构建和简化 KML)和客户端(数据绑定结果网格,在地图上覆盖大 KML 文件)都是处理器密集型的.

我喜欢在键入时立即获得逐渐缩小的结果,但我想尽量减少刷新的次数。在用户停止输入之后,在运行 update 函数之前引入 N 秒延迟的最简单方法是什么?

【问题讨论】:

【参考方案1】:

不要直接调用update(),而是调用一个包装器来检查是否有任何待处理的延迟更新:

$('input.Search').bind("keyup", delayedUpdate);

function delayedUpdate() 
    if (updatePending) 
        clearTimeout(updatePending);
    

    updatePending = setTimeout(update, 250);


function update() 
    updatePending = false;

    //$.ajax(...

您还应该添加:

$('input.Search').bind("blur", update);

这将在用户离开该字段时立即更新。但请确保您还添加了针对用户离开该字段而等待延迟更新(首先取消延迟更新)的情况的处理。

【讨论】:

【参考方案2】:

作为第一种方法,例如:

$('input.Search').bind("keyup", function()  setTimeout(update, 5)  );

(不确定确切的 setTimeout 语法)。

您还可以保留一个变量来跟踪是否已经安排了超时。

【讨论】:

在等待 5 毫秒后,这将有效地产生相同数量的不必要负载。【参考方案3】:

您可以使用 Window.SetTimeOut(YourRefreshMethod) ,当 YourRefereshMethod 被调用时,它会检查到目前为止输入的字符数,并将其与某个计数器进行比较,计数器将从 0 值开始,所以初始调用除了用当前输入的字符数更新计数器外,第二次调用您的方法时,它将检查输入的字符数,如果它与计数器记录的先前数字匹配,则表示用户没有t 键入任何新内容,您可以触发 Refresh 方法,否则您将更新计数器值

【讨论】:

以上是关于如何设置计时器以防止重叠 ajax 调用?的主要内容,如果未能解决你的问题,请参考以下文章

Firestore限制每小时或每天读写一次,以防止用户在检查器中设置计时器

如何使用 pushViewController 方法防止计时器重置?

刷新网页时如何防止倒数计时器重置?

Firestore 限制每小时或每天的读写次数,以防止用户在检查器中设置计时器

我可以精确计时重叠的 ReadFileEx 操作吗?

Azure 函数 - 防止多次调用