关于提交AJAX请求后成功,不执行success去执行error的原因及分析

来源:互联网 发布:小黄鸡软件下载 编辑:程序博客网 时间:2024/05/17 23:13

         又到了临近期末之际,这学期学的javaWeb也要开始做期末项目了。我(们)做的是一个类似于网上零售的商城系统。其中我有用到ajax的异步请求方式,而在我码代码的过程中,发现了一个很奇怪的现象:ajax提交给后台的请求有执行成功,但是当执行了之后却不去执行success回调而执行error回调,先上代码: 

 function deleteCar(carID) {        if (confirm("确认要删除?")) {$.ajax({url:"servlet/DeleteCarServlet",data:{"carID":carID},type:"GET",  dataType:"json",   success:function(data){      if(data=="SUCCESS"){$("#productID_"+carID).hide();alert(data+"删除成功");return;}else{alert("操作失败");return;}},error:function(){alert("error");}});        }    }


在这里调用该函数:

<td class="delete"><button onclick="deleteCar(<%=car.getCarID()%>);">删除</button></td>


而当我调试的时候,却出现了这种情况,没有执行success,去执行了error



而在后台,可以看到确实已经执行了我的业务逻辑代码:


我就意识到可能哪一个环节出问题了,但后台逻辑代码没错的话就肯定是前端有问题,而且肯定就是这个ajax请求或是调用的那一行有错。

我又去网上搜索了些关于何时调用success和errord的问题,总结如下:

Ajax请求通过XMLHttpRequest对象发送请求,该对象有四个状态(readyState):

0-未初始化、1-正在初始化、2-发送数据、3-正在发送数据、4-完成。

当XMLHttpRequest.readyState为4时,表示ajax请求已经完成可以得到响应结果。

ajax的success和error方法根据响应状态码来触发。当XMLHttpRequest.status为200的时候,表示响应成功,此时触发success().其他状态码则触发error()。

除了根据响应状态码外,ajax还会在下列情况下走error方法:

1. 返回数据类型不是JSON

2. 网络中断

3. 后台响应中断         点击打开链接



可以知道,竟然后台的代码都执行了,那状态码肯定是已经经过了这4个的,所以问题不在这

我继续看代码,这里确实没有问题啊,难道是前端的那一行调用的代码出错?我索性将<button>换成<a> 看看行不行,


<a onclick="deleteCar(<%=car.getCarID()%>);">删除</a>


一调试,还真的可以!!!



而为什么<a>标签可以<button> 不行呢?我在网上找到了这个答案:


既然用了Ajax就不应该用OnClick事件。
1、点击Button按钮,先执行OnClientClick客户端脚本,return true时进行页面回发。
2、使用Ajax异步请求,回调函数接收数据之前,页面已经回发了。原来的页面已经不存在,上哪接收异步请求返回的结果。

其实这个并不是我的这个的答案,不过也可以参考。


而且我发现,当dataType知名为“json”而返回的又不是json时,肯定会出错,所以若返回的类型不是json,这一个属性可以不填。