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

如何在JavaScript中每10秒销毁并重建DataTable?

问题排查与修复方案

原代码核心问题

  1. 未启动定时刷新任务:仅执行了一次staffTransaction(),没有通过setInterval实现每10秒自动调用
  2. DataTable实例管理混乱:重复创建、销毁实例,还嵌套setTimeout初始化,导致表格状态冲突
  3. 全局变量风险:table、table1作为全局变量,容易引发实例覆盖或内存泄漏
  4. 缺少错误处理: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);
});

关键修改说明

  1. 添加定时任务:用setInterval启动每10秒刷新,同时保存定时器ID用于页面卸载时清理
  2. 规范DataTable实例管理:
    • 每次刷新前检查并销毁已存在的DataTable实例,避免冲突
    • 去掉原代码中冗余的destroy和setTimeout初始化逻辑,直接在渲染完数据后初始化一次
  3. 优化代码风格:
    • 用const/let替代全局变量,避免污染全局作用域
    • 用模板字符串简化HTML拼接,提升可读性
    • 简化日期判断逻辑(from_date || ""等价于原判断)
  4. 添加错误处理:通过catch捕获API请求错误,避免刷新流程中断,同时给出错误提示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 17:40:25