为何axios.get未触发.then/.catch?浏览器首次用axios遇响应接收问题
你提到之前用$.ajax能正常调用目标服务,但换成axios.get后既没进入.then也没触发.catch,服务本身是正常运行的。这种情况大概率是请求被挂起、配置不匹配,或者对Axios的响应结构不熟悉导致的,咱们一步步排查解决:
1. 先看浏览器网络请求的真实状态
打开浏览器开发者工具(F12)切换到Network标签,触发prugAdm_upd函数,观察这个Axios请求的状态:
- 如果请求一直处于
pending状态:说明请求发出去了,但服务器没返回响应,或者被跨域、浏览器安全策略拦截了 - 如果根本看不到这个请求:说明Axios的调用逻辑有问题(比如参数错误导致请求没触发)
2. 对齐jQuery的跨域/凭证配置
Axios的跨域处理和jQuery有细微差异,如果你之前的$.ajax需要带凭证(比如Cookie),Axios默认是不携带的,得手动开启:
axios.get('../../common/json_CallProcReturnEmpty.php', { params: {proc:'prugadm_actn',libl: libl /* 你的其他参数 */}, withCredentials: true // 和$.ajax的xhrFields.withCredentials对应 })
同时确认服务器端的CORS响应头(比如Access-Control-Allow-Origin、Access-Control-Allow-Credentials)配置正确,和之前支持$.ajax的配置一致。
3. 补全Axios的错误捕获与日志排查
单纯的.catch可能捕获不到所有异常,你可以临时添加全局拦截器,打印请求/响应的详细日志,定位问题节点:
// 在你的prugAdm_upd函数前添加这段临时排查代码 axios.interceptors.request.use(config => { console.log('请求已发送,配置详情:', config); return config; }, error => { console.error('请求发送阶段失败:', error); return Promise.reject(error); }); axios.interceptors.response.use(response => { console.log('收到响应,响应详情:', response); return response; }, error => { console.error('响应处理阶段失败:', error); return Promise.reject(error); });
触发请求后看控制台日志,就能知道是请求发不出去,还是响应收不到,或者是响应处理出了问题。
4. 注意Axios的响应结构和jQuery不同
这是很多人转Axios时容易踩的坑:jQuery的success回调直接返回服务器的JSON数据,但Axios的.then回调返回的是一个封装后的响应对象,真实的JSON数据在response.data里。
比如你之前用jQuery可能是这么处理的:
$.ajax({ // ...配置 success: function(data) { compFunc(data, errmsg); // 直接用data } })
换成Axios要改成:
axios.get(/* ...配置 */) .then(response => { const realData = response.data; // 这里才是服务器返回的JSON console.log('真实响应数据:', realData); compFunc(realData, errmsg); }) .catch(error => { console.error('请求出错:', error); errmsg = error.message; compFunc(null, errmsg); })
说不定你不是没收到响应,只是没取到正确的位置!
5. 对比参数与最简请求测试
- 把Axios的
params参数和之前$.ajax的data参数做对比,确认没有遗漏、参数类型(比如数字/字符串)完全一致 - 先测试一个不带任何参数的最简请求,看是否能正常触发
.then:
axios.get('../../common/json_CallProcReturnEmpty.php') .then(res => console.log('最简请求成功:', res.data)) .catch(err => console.log('最简请求失败:', err));
如果最简请求能成功,说明是参数或自定义配置的问题;如果还是不行,可能是Axios版本冲突、浏览器环境限制,或者服务端对请求头的要求和jQuery不同(比如Content-Type)。
内容的提问来源于stack exchange,提问作者RockBoro

