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

如何在AJAX GET请求成功获取服务器响应后停止setInterval?

问题:AJAX GET请求成功后停止setInterval调用

我想停止setInterval()调用,最佳方式是在AJAX GET请求完成并成功获取响应后,调用clearInterval()。之前试过用setTimeout,但它不够精确,因为实际耗时可能比设置的延迟更长或更短,所以需要实现类似if GET successful {clearInterval()}的逻辑。

原代码如下:

$(document).on('submit', '#post-form', function(e) {
  e.preventDefault();

  $.ajax({
    type: 'POST',
    url: '/send',
    data: {
      room_name: $('#room_name').val(),
      csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val(),
    },
    success: function(data) {
      //alert(data)
    }
  });

  $(document).ready(function com() {

    loop = setInterval(function() {
      $.ajax({
        type: 'GET',
        url: "/trafic",
        success: function check(response) {
          //SOME CODE//

        },
        error: function(response) {
          //SOME CODE//
        }
      });
    }, 1000)
    setTimeout(clearInterval(loop), 10000);

  })
});

解决方案

直接在GET请求的success回调函数中调用clearInterval()即可,同时注意变量作用域,避免使用全局变量:

  1. 将loop变量声明为局部变量,防止全局污染
  2. 在GET请求成功时立即清除定时器

修改后的代码:

$(document).on('submit', '#post-form', function(e) {
  e.preventDefault();

  $.ajax({
    type: 'POST',
    url: '/send',
    data: {
      room_name: $('#room_name').val(),
      csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val(),
    },
    success: function(data) {
      //alert(data)
    }
  });

  $(document).ready(function com() {
    // 用let声明局部变量,避免全局污染
    let loop = setInterval(function() {
      $.ajax({
        type: 'GET',
        url: "/trafic",
        success: function check(response) {
          // 执行你的业务代码
          // SOME CODE//

          // 请求成功后立即清除定时器
          clearInterval(loop);
        },
        error: function(response) {
          //SOME CODE//
        }
      });
    }, 1000);

    // 保留这个setTimeout作为超时兜底,防止请求一直失败导致定时器持续运行
    setTimeout(function() {
      clearInterval(loop);
    }, 10000);
  });
});

关键点说明

  • 在success回调中调用clearInterval(loop),确保请求成功后立即停止定时器,完全匹配需求
  • 保留原有的setTimeout作为超时兜底,避免因请求持续失败导致定时器无限运行
  • 使用let声明loop变量,将其作用域限定在com函数内部,避免全局变量冲突

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:20:43