繁体   English   中英

由于.done回调,JQuery ajax成功触发了两次

[英]JQuery ajax success fired twice, because of .done callback

我有一些旧代码,在场景中中止ajax请求,然后在用户响应后重新发送该请求。

function resendLastAjaxRequest(ajaxRequest, ajaxSettings){
    if(ajaxSettings != undefined){
        $.ajax(ajaxSettings).done(function ( data ) {
            ajaxSettings.success(data);
        });
    }

现在,上面的代码为请求触发了成功处理程序两次,但是它已经存在了一年多了,没人遇到。 是因为jquery版本更新。 我们目前使用的是2.0.3,我不知道何时确切地更新了jquery,但可能是在较早的版本中done了而不是success 进行了一些挖掘,但找不到任何原因使它工作了这么长时间,请提供帮助。

更新

成功和$ .ajax的.done()方法有什么区别

它包含一条评论说

好的,它是jQuery 1.8 :)由于$ .ajax从jQuery 1.5返回了promise,这是一个简单的替换,以解决一致性问题(使用deferred接口):done()代替了success(),fail()表示错误()和always()代表complete()

这意味着如果调用done ,那么我们必须显式触发success 这可能是它工作了这么长时间的原因。 但是现在,在完成触发之前,已经调用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() ),因此成功方法作为回调调用,然后.done()在控制台中引发错误而不会破坏任何内容(就像undefined is not a function )。 因此,在这种情况下,控制台中将发生错误,并且仅调用了一个回调函数。

jQuery 1.4.4演示: jsfiddle

在控制台中:

1错误undefined is not a function (由于.done()

1个日志Object (来自调用的数据)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM