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

使用Ajax重载JS Datatables遇TypeError错误的解决求助

Datatables调用ajax.reload()时报TypeError: xhr.abort is not a function的解决方法

问题场景

我是JS新手,用Meteor框架结合Datatables开发一个展示AWS存储桶文件、支持下载/删除的应用。服务器端的删除逻辑已经完成,但调用template.table.ajax.reload()刷新表格时,一直报TypeError: xhr.abort is not a function错误。排查后发现,本该包含abort()方法的xhr对象,实际是一个已兑现但结果为undefined的Promise。

试过删除后重新加载整个表格,但会导致页面刷新,列表回到第一页;也试过table.ajax.url().load(),同样没有效果。

初始代码

表格初始化和删除按钮的核心代码如下:

Template.Home.onRendered(async function () {
    this.table = $('#bucketItemTable').DataTable({
        "ajax": async function(data, callback, settings) {
            const tableData = await new Promise((resolve, reject) => {
                // 调用服务器端方法获取表格数据
                Meteor.call("refreshList", (error, result) => {
                    if (error) return reject(error);
                    resolve(result);
                });
            });

            callback( { data: tableData } );
        }
    });
});

Template.Home.events({
    // 删除按钮:先执行删除操作,再刷新表格
    'click .btn-delete': async function(e, template) {
        ... // 省略删除AWS存储桶文件的Meteor调用逻辑

        template.table.ajax.reload();
    }
});

问题原因

Datatables的自定义ajax函数要求返回一个带有abort()方法的XHR对象(或兼容的可中止对象),但这里直接用了async函数作为ajax配置项——async函数默认会返回Promise,而这个Promise并没有abort()方法,所以调用ajax.reload()时就会触发错误。

解决方法

把异步逻辑包装在一个内部函数中,不让外层的async函数直接返回Promise(或者说让外层函数的返回值不被Datatables当成XHR对象处理),修改后的ajax配置代码如下:

"ajax": async function(data, callback, settings) {
    let ajaxFunc = async function () {
        const tableData = await new Promise((resolve, reject) => {
            Meteor.call("refreshList", (error, result) => {
                if (error) return reject(error);
                resolve(result);
            });
        });

        callback( { data: tableData } );
    }
    ajaxFunc();
}

这样外层的async函数虽然仍返回Promise,但Datatables不会将其作为XHR对象处理,内部的异步逻辑通过调用callback传递数据,就能正常执行ajax.reload()刷新表格了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 10:25:38