JQuery ajax success被触发两次,因为有.done回调。
JQuery ajax success被触发两次,因为有.done回调。
我有一些遗留的代码,在某种情况下中断ajax请求,然后在用户响应后重新发送该请求。
现在,上面的代码会触发请求的成功处理程序两次,但它已经存在了一年多,没有人遇到过这个问题。这是因为jQuery版本更新的原因吗?我们目前使用的是2.0.3版本。
我不知道jQuery何时被更新,但可能在早期版本中,使用的是done而不是success。
我进行了一些调查,但找不到为什么它可以工作那么长时间的原因,请帮忙解答。
更新:
what is difference between success and .done() method of $.ajax
其中有一个评论说:
好吧,这是jQuery 1.8 🙂 自从jQuery 1.5开始,$.ajax返回一个promise
这只是为了保持一致性(使用延迟接口)的一个简单替换:done()代替success(),fail()代替error(),always()代替complete()
这意味着如果调用了done,那么我们必须显式触发success。这可能是它能够长期工作的原因。但现在,在done触发之前,success处理程序已经被调用,然后done回调再次调用success处理程序。
对如何更改/修改代码以便只调用一次success有任何建议吗?
编辑:
ajaxSettings的样子如下:
accepts: Object async: true cache: false complete: function (request, status) contentType: "application/x-www-form-urlencoded; charset=UTF-8" contents: Object converters: Object crossDomain: false dataTypes: Array[1] error: function (request, status){flatOptions: Object global: true hasContent: false isLocal: false jsonp: "callback" jsonpCallback: function (){var e=hn.pop()||x.expando+"_"+Yt++;return this[e]=!0,e}loadingdisplay: trueprocessData: true responseFields: Object success: function (htmlData) {type: "GET"
JQuery ajax success fired twice, because of .done callback这个问题的出现是因为之前使用的是低于1.5版本的JQuery,没有实现.done()方法,所以success方法作为回调被调用,然后.done()在控制台抛出一个错误,但没有中断任何操作(比如undefined is not a function)。所以在这种情况下,控制台会有一个错误,只有一个回调函数被调用。
解决方法是升级JQuery的版本到1.5或更高版本,或者可以手动在代码中添加.done()方法的实现。
以下是一个使用JQuery 1.4.4版本的示例:
Demo with jQuery 1.4.4: jsfiddle
在控制台中会有以下输出:
1个错误: undefined is not a function(因为.done()方法)
1个日志: Object(来自调用的数据)
所以,为了解决这个问题,可以升级JQuery版本或手动添加.done()方法的实现。