You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免使用setTimeout时触发多次重复AJAX请求

解决方案

你当前的问题本质是每次keyup事件都会创建独立的定时器,多个定时器并行计时,到期后都会触发请求,导致重复调用。需要加入防抖逻辑:每次触发输入时先清除上一个未执行的定时器,只有当连续输入停止满500ms后,才发起一次请求。

修复后代码

// 存储定时器标识,用于清除前一次未执行的延时任务
let searchTimer = null;

$(".qs-text").keyup(function() {
  // 每次输入先清空之前的定时器,取消未执行的请求逻辑
  clearTimeout(searchTimer);
  const currentInput = $(this).val();

  if (currentInput.length > 2) {
    // 生成新的定时器,仅当500ms内无新输入时才会执行
    searchTimer = setTimeout(function() {
      // 对请求参数做编码处理,避免特殊字符导致请求异常
      $.get("ajax_request.php?req=Quicksearch&qs=" + encodeURIComponent(currentInput), function(data) {
        $('.qs-hits').text(data);
      });
    }, 500);
  } else {
    $('.qs-hits').text('-');
  }
});

可选优化建议

  • 替换keyup事件为input事件,可覆盖粘贴、右键增减内容等非键盘输入的场景,适配更多用户操作
  • 可新增未完成请求的取消逻辑:如果上一次搜索请求还未返回就触发了新的输入,调用abort()终止旧请求,避免旧请求的返回结果覆盖新搜索的正确结果
  • 可根据业务体验调整延时时长,常规搜索场景下300-600ms都是合理范围

内容的提问来源于stack exchange,提问作者OsakaWebbie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 13:36:03