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

点击按钮后如何定时调用AJAX获取Node.js后端实时数据?

实现AJAX定时获取实时数据并更新页面的最佳方案

嘿,我来帮你梳理下这个问题~ 你需要点击按钮后每隔5秒从Node.js后端拉取实时数据,并且不想让表格一直追加重复内容。下面给你分析最合适的实现方案,以及具体的代码修改:

核心问题拆解

你当前的代码用了append(),所以每次AJAX请求成功都会往表格里新增行,这显然不是你想要的——我们需要每次获取新数据后先清空表格,再重新渲染最新内容。另外还要注意:按钮多次点击会创建多个定时任务,必须先清除旧的定时器,避免重复请求堆积。

方案选择:setInterval vs 递归setTimeout

两种方案都能实现需求,但适用场景略有不同:

  • setInterval:最直观,适合请求响应稳定、不会出现延迟的场景
  • 递归setTimeout:更可靠,会在上一次请求完成后再等待5秒发起下一次,避免网络慢时出现请求堆积

方案一:用setInterval实现(简单直观)

<script type="text/javascript">
$(document).ready(function(){
 // 定义定时器变量,用于后续清除任务
 let refreshTimer = null;

 // 第一个AJAX请求(保持原有逻辑)
 $.ajax({
 url: "http://localhost:8070/api/route1",
 type: 'POST',
 dataType:'json',
 success: function(res) {
 // 你的原有处理逻辑
 }
 });

 $("#myButton").click(function(){
 // 先清除之前的定时器,防止多次点击创建多个定时任务
 if(refreshTimer) {
 clearInterval(refreshTimer);
 }

 // 启动定时刷新,每隔5秒执行一次AJAX请求
 refreshTimer = setInterval(function(){
 $.ajax({
 url: "http://localhost:8070/api/route2",
 type: "POST",
 dataType: "json",
 success: function (res) {
 // 关键:先清空表格,再重新渲染最新数据,避免重复追加
 $('#table1').empty();
 $.each(res.result1, function(key, value) {
 console.log("Index",key);
 console.log("Item",value);
 const tableData='<tr><td><a onclick="demoDiv()">'+value+'</a></td><td>'+res.result2[key]+'</td></tr>';
 $('#table1').append(tableData);
 });
 },
 beforeSend: function() {
 // 你的原有逻辑
 },
 complete: function() {
 // 你的原有逻辑
 },
 error: function(xhr, status, error) {
 // 新增错误处理,避免静默失败
 console.error('数据请求失败:', error);
 }
 });
 }, 5000); // 5秒间隔
 });
});
</script>

方案二:递归setTimeout实现(更可靠)

如果你的请求可能存在网络延迟,这个方案能避免请求堆积:

<script type="text/javascript">
$(document).ready(function(){
 let refreshTimer = null;

 // 第一个AJAX请求(保持原有逻辑)
 $.ajax({
 url: "http://localhost:8070/api/route1",
 type: 'POST',
 dataType:'json',
 success: function(res) {
 // 你的原有处理逻辑
 }
 });

 // 封装单独的刷新函数
 function fetchLatestData() {
 $.ajax({
 url: "http://localhost:8070/api/route2",
 type: "POST",
 dataType: "json",
 success: function (res) {
 // 先清空表格再渲染
 $('#table1').empty();
 $.each(res.result1, function(key, value) {
 console.log("Index",key);
 console.log("Item",value);
 const tableData='<tr><td><a onclick="demoDiv()">'+value+'</a></td><td>'+res.result2[key]+'</td></tr>';
 $('#table1').append(tableData);
 });
 // 请求成功后,再过5秒发起下一次请求
 refreshTimer = setTimeout(fetchLatestData, 5000);
 },
 beforeSend: function() {
 // 你的原有逻辑
 },
 complete: function() {
 // 你的原有逻辑
 },
 error: function(xhr, status, error) {
 console.error('数据请求失败:', error);
 // 出错后也可以选择重试,这里继续定时
 refreshTimer = setTimeout(fetchLatestData, 5000);
 }
 });
 }

 $("#myButton").click(function(){
 // 清除之前的定时器
 if(refreshTimer) {
 clearTimeout(refreshTimer);
 }
 // 第一次立即执行,之后每隔5秒循环
 fetchLatestData();
 });
});
</script>

关键注意点

  • 避免重复追加:必须用$('#table1').empty()先清空表格,再重新添加新行,确保每次展示的都是最新数据
  • 清理定时器:每次点击按钮前清除旧的定时器,防止多个定时任务同时运行
  • 错误处理:添加error回调,方便排查请求失败的问题,也能根据需求选择是否重试

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 22:42:30