如何在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()即可,同时注意变量作用域,避免使用全局变量:
- 将
loop变量声明为局部变量,防止全局污染 - 在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
相关产品推荐
相关产品推荐

