AJAX POST请求success函数未触发的原因及修复方案
解决AJAX POST请求Stalled且Success函数不触发的问题
看起来你遇到的情况很典型:数据已经送达服务器,但前端的success回调始终没执行,Chrome网络面板还显示连接stalled、提示"connection is not finished yet"——这大概率是服务器响应不完整或者前端AJAX配置有遗漏导致的。结合你的代码片段,我给你几个具体的排查和解决方向:
1. 先补全并完善AJAX配置
你的代码里type: ...是不完整的,必须明确指定为'POST',而且一定要加上error回调(很多时候success不触发是因为请求走到了error分支,但你没加就看不到原因),同时别忘了把modif作为请求数据传入:
var modif = { CRN: $("#DIAS").parent().parent().parent().children()[0].children[0].innerText, DIAS: $("#DIAS").val(), start_hr: $("#STRHR").val(), end_hr: $("#ENDHR").val(), title: $("#TITLE").val() } $.ajax({ url: '/cmanager/edit', dataType: 'text', type: 'POST', // 必须明确指定POST方法 data: modif, // 传入构造好的请求数据 success: function(response) { console.log('请求成功:', response); }, error: function(xhr, status, error) { // 这个回调能帮你捕获所有失败场景 console.log('请求出错详情:', status, error); console.log('HTTP响应状态码:', xhr.status); } });
先加上error回调,打开浏览器控制台看输出,这是最快定位问题的第一步。
2. 检查服务器端是否正确返回响应
服务器虽然接收了数据,但可能没有完成响应流程:
- 查看服务器日志,确认处理请求时有没有抛出异常、超时,或者是否忘记结束响应(比如某些后端框架需要手动调用
res.end()/response.send()这类方法,或者输出缓冲没刷新) - 在Chrome网络面板里查看该请求的响应详情:确认HTTP状态码是200(或其他成功状态码),响应体是符合
dataType: 'text'要求的纯文本,而且Content-Length字段和实际响应体长度匹配(如果没有Content-Length,要确认服务器用了分块传输编码且正确结束了分块)
3. 排查请求被挂起的原因
Chrome里的"stalled"状态通常表示请求被挂起,常见原因有:
- 浏览器并发连接限制:同一域名下同时发起的请求数超过了浏览器限制(一般是6个),导致后续请求排队
- 服务器端限流/防火墙拦截:服务器可能对请求频率做了限制,或者防火墙截断了响应连接
4. 简化数据结构,排除DOM取值问题
你的CRN是通过多层DOM嵌套获取的innerText,可能意外包含了换行、空格或特殊字符,导致数据解析异常:
- 先把
CRN换成固定测试值,比如CRN: 'test123',如果请求正常了,再去优化DOM取值的代码(比如用更可靠的.closest()和.text().trim()):
// 替代多层parent的更简洁写法 CRN: $("#DIAS").closest('tr').find('td:first').text().trim()
5. 确认是否存在跨域/CORS问题
虽然你的URL是相对路径,但如果部署时前端和服务器不在同一端口/域名,要确认服务器是否配置了正确的CORS响应头,否则浏览器会拦截响应,导致success不触发。
先从添加error回调开始排查,控制台的错误信息会帮你快速锁定问题!
内容的提问来源于stack exchange,提问作者Emanuel Silva
相关产品推荐
相关产品推荐

