如何在JavaScript中每10秒销毁并重建DataTable?
问题排查与修复方案
原代码核心问题
- 未启动定时刷新任务:仅执行了一次
staffTransaction(),没有通过setInterval实现每10秒自动调用 - DataTable实例管理混乱:重复创建、销毁实例,还嵌套
setTimeout初始化,导致表格状态冲突 - 全局变量风险:
table、table1作为全局变量,容易引发实例覆盖或内存泄漏 - 缺少错误处理:API请求失败时无任何处理,会导致刷新中断
修复后的完整代码
// 声明定时器变量,方便后续清理 let refreshTimer; // 声明表格实例变量,用于管理DataTable let transactionTable; // 启动定时刷新,每10秒执行一次 refreshTimer = setInterval(staffTransaction, 10000); // 首次加载执行一次 staffTransaction(); function staffTransaction() { const todayDate = new Date(); const dd = String(todayDate.getDate()).padStart(2, '0'); const mm = String(todayDate.getMonth() + 1).padStart(2, '0'); const yyyy = todayDate.getFullYear(); const to_date = `${dd}-${mm}-${yyyy}`; const date = new Date(); date.setDate(date.getDate() - 7); const from_date = `${date.getDate()}-${date.getMonth() + 1}-${date.getFullYear()}`; const offerType = $('#offerType option:selected').val(); const transStaff = { "admin_id": localStorage.getItem("admin_id"), "role": localStorage.getItem("role"), "offer_type": 'znapay', "from_date": from_date || "", "to_date": to_date || "", "store_id": localStorage.getItem('store-ids'), "branch_id": localStorage.getItem('store_branch') }; fetch('https://app/api/v6/manager/transactions-web', { method: "POST", body: JSON.stringify(transStaff), headers: { 'Content-Type': 'application/json', 'accept': 'application/json' } }) .then(res => res.json()) .then(callback => { $('#transaction-lists').empty(); $("#transaction-dates").text(`Transactions from ${callback.from_date} to ${callback.to_date}`); let ListTransation = ""; const transList = callback.transaction_list; if (transList.length === 0) { $('.not-found').html("<p>Data Not Found"); ListTransation = "<tr><td colspan='7' align='center'>No Transactions</td></tr>"; $('#transaction-lists').html(ListTransation); } else { transList.forEach((x, y) => { if (y === 0) { localStorage.setItem("last_transaction", x.transaction_id); } const email_help = x.elapsed_time <= 1800 ? "<img src='assets/images/email.png'>" : ""; ListTransation += ` <tr id="${x.transaction_id}"> <td class='reference-id'>${x.reference_id}</td> <td>${x.date}</td> <td>${x.offer_type_label}</td> <td>${x.offer_class}</td> <td>${x.store_location}, ${x.store_city}</td> <td class='bill-amount' style='text-align:center!important'>AED ${parseFloat(x.bill_amount).toFixed(2)}</td> <td>${email_help}</td> </tr> `; }); $('#transaction-lists').html(ListTransation); } // 先销毁已存在的DataTable实例 if ($.fn.DataTable.isDataTable('.staff-transtable')) { transactionTable.destroy(); } // 重新初始化DataTable transactionTable = $('.staff-transtable').DataTable({ searching: true, paging: true, retrieve: false // 不需要retrieve,直接创建新实例 }); }) .catch(err => { console.error('API请求失败:', err); // 可选:请求失败时显示错误提示 $('.not-found').html("<p>加载数据失败,请稍后重试"); }); } // 页面卸载时清理定时器,避免内存泄漏 window.addEventListener('beforeunload', () => { if (refreshTimer) clearInterval(refreshTimer); });
关键修改说明
- 添加定时任务:用
setInterval启动每10秒刷新,同时保存定时器ID用于页面卸载时清理 - 规范DataTable实例管理:
- 每次刷新前检查并销毁已存在的DataTable实例,避免冲突
- 去掉原代码中冗余的
destroy和setTimeout初始化逻辑,直接在渲染完数据后初始化一次
- 优化代码风格:
- 用
const/let替代全局变量,避免污染全局作用域 - 用模板字符串简化HTML拼接,提升可读性
- 简化日期判断逻辑(
from_date || ""等价于原判断)
- 用
- 添加错误处理:通过
catch捕获API请求错误,避免刷新流程中断,同时给出错误提示
内容的提问来源于stack exchange,提问作者Siva MCA
相关产品推荐
相关产品推荐

