layui table 的 error 回调仅在 HTTP 状态码非200或 parseData 内抛异常时触发;常见失效原因包括 parseData 静默吞错、后端返回非 JSON、DOM 未清理;需配合 clearCache、empty、完整重 render 实现重试。

layui table 的 error 回调到底什么时候触发
它只在两种情况下执行:HTTP 响应状态码非 200(如 401、500、502),或 parseData 函数内部抛出异常(比如 JSON 解析失败、throw new Error())。注意:如果后端返回 HTML 错误页或纯文本(如 "token expired"),且没被 parseData 捕获,error 不会触发——此时得靠 done 回调里的 xhr 对象判断。
为什么写了 error 回调却没看到提示或执行逻辑
常见原因有三个:
-
parseData里静默吞了错误:比如你写了if (res.code !== 0) return { code: 1 };却没设msg字段,layui 认为“失败但无提示信息”,就不弹框也不进error - 后端返回非 JSON(如 Nginx 502 页面),
parseData根本不执行,error也不会触发,必须在done里检查xhr.status和xhr.responseText - 表格容器(如
#demo)已渲染过表头或分页栏,error触发时 DOM 仍残留,视觉上像“卡住”而非失败——这不是回调没跑,而是你没清现场
怎么让 error 回调真正可用并显示重试按钮
三步缺一不可:
- 在
table.render()配置中明确写error: function(res){ ... },不要只依赖默认行为 - 回调内立刻执行
table.clearCache('demo')(2.8+ 版本必须传 id)和$('#demo').empty(),否则旧表头和新按钮会叠在一起 - 插入按钮后,绑定点击事件,调用
table.render({ ... })传**完整原始配置对象**;不能只用table.reload(),它不重传url、where、page等关键参数,极易漏请求条件
parseData 是捕获后端错误详情的唯一可靠入口
如果你需要把后端返回的 msg 或 error 字段透传给用户,必须在 parseData 里处理:
parseData: function(res){
if (res.code !== 0) {
return {
code: res.code,
msg: res.msg || res.error || '请求异常',
count: 0,
data: []
};
}
return { code: 0, count: res.count, data: res.data };
}
这个 msg 会被 layui 自动用于弹窗提示,并触发 error 回调。别指望 done 能拿到原始响应体——它只在成功时才给你处理后的数据,失败时只给空对象或 xhr。
最容易被忽略的是:非 JSON 响应(比如服务端崩了返回 HTML)会让 parseData 彻底失效,这时 error 不触发,done 的第三个参数才是唯一救命稻草。别只测正常流程,一定要模拟 502、断网、跨域拒绝这些场景。


















