【发布时间】:2014-11-22 05:24:37
【问题描述】:
我有一些遗留代码,它在场景中中止 ajax 请求,然后在用户响应后重新发送该请求。
function resendLastAjaxRequest(ajaxRequest, ajaxSettings){
if(ajaxSettings != undefined){
$.ajax(ajaxSettings).done(function ( data ) {
ajaxSettings.success(data);
});
}
现在,上面的代码为请求触发了两次成功处理程序,但它已经存在一年多了,没有人遇到它。是不是因为jquery版本更新。我们目前使用的是 2.0.3
我不知道 jquery 究竟是什么时候更新的,但可能是在早期版本中,done 被解雇了,而不是 success。
进行了一些挖掘,但找不到任何可能工作这么长时间的原因,请帮助。
更新
what is difference between success and .done() method of $.ajax
它包含一个评论说
好的,它是 jQuery 1.8 :) 因为 $.ajax 从 jQuery 1.5 返回一个承诺 这是对一致性问题的简单替换(使用 deferred)的接口:done()代替success(),fail()为 error() 和 always() for 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"
【问题讨论】:
-
你能展示你的
ajaxSettings对象吗 -
我不知道旧的 jQuery 版本,但它现在似乎是好的行为。您在传递给 ajax 调用的对象中有一个“成功”方法,因此当 ajax 请求成功时,该方法将作为回调调用。在 .done 承诺中,您还调用了这个成功方法。您只需选择其中之一即可使其正常工作。
-
@OxyDesign 是的,这就是修复,但我更关心的是,它是如何工作这么长时间的?
-
2.0.3 更改之前使用的上一个版本是什么?
-
如果低于1.5,我认为
.done()没有实现,所以success方法作为回调调用然后.done抛出错误控制台没有破坏任何东西(比如“undefined is not a function”)。所以在这种情况下,你在控制台中有一个错误,并且只调用了一个回调函数。
标签: javascript jquery ajax