Javascript JQuery ajax成功触发了两次,原因是.done回调
我有一些遗留代码,在一个场景中中止ajax请求&然后在用户响应之后,重新发送该请求Javascript JQuery ajax成功触发了两次,原因是.done回调,javascript,jquery,ajax,Javascript,Jquery,Ajax,我有一些遗留代码,在一个场景中中止ajax请求&然后在用户响应之后,重新发送该请求 function resendLastAjaxRequest(ajaxRequest, ajaxSettings){ if(ajaxSettings != undefined){ $.ajax(ajaxSettings).done(function ( data ) { ajaxSettings.success(data); }); } 现
function resendLastAjaxRequest(ajaxRequest, ajaxSettings){
if(ajaxSettings != undefined){
$.ajax(ajaxSettings).done(function ( data ) {
ajaxSettings.success(data);
});
}
现在,上面的代码为请求启动了两次成功处理程序,但是它已经存在一年多了&没有人遇到它。这是因为jquery版本更新。我们目前正在使用2.0.3
我不知道jquery到底是什么时候更新的,但可能是在早期版本中,done
被激发而不是success
。
做了一些挖掘,但找不到任何原因,为什么它可能已经工作了这么久,请帮助
更新
它包含一条评论说
好的,这是jQuery1.8:),因为$.ajax从jQuery1.5返回一个承诺
这是一致性问题的简单替代(使用
延迟的接口):done()代替success(),fail()代替
完整()的错误()和始终()
这意味着如果调用了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版本低于1.5(未实现
.done()
),因此success方法被调用为回调,然后.done()
在控制台中抛出一个错误,而不破坏任何东西(比如未定义的不是函数
)。因此,在本例中,控制台中有一个错误,只调用了一个回调函数
使用jQuery 1.4.4进行演示:
在控制台中:
1错误:未定义不是函数
(因为.done()
)
及
1日志:对象
(来自调用的数据)
你能显示你的
ajaxSettings
object吗?我不知道旧jQuery版本的情况,但现在看来这是一个很好的行为。在传递给ajax调用的对象中有一个方法“success”,因此当ajax请求成功时,该方法将作为回调调用。在.done承诺中,您也会调用此成功方法。你只需要选择其中一个就可以了。@OxyDesign是的,这是修复方法,但我更关心的是,它是如何工作这么长时间的?在你更改为2.0.3之前使用的是什么版本?如果低于1.5,我想.done()
没有实现,因此,success
方法作为回调调用,然后.done
在控制台中抛出一个错误,而不破坏任何内容(比如“undefined is not a function”)。因此,在本例中,控制台中有一个错误,只调用了一个回调函数。