由于.done回调,JQuery ajax成功解雇了两次

时间:2014-09-27 07:37:28

标签: javascript jquery ajax

我有一些遗留代码,可以在场景中放弃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返回一个promise   这是对一致性的简单替换(使用   延迟接口):done()代替success(),fail()   error()和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"

1 个答案:

答案 0 :(得分:1)

就像我在评论中所说,我认为之前你有一个 jQuery 版本低于1.5 (没有实现.done())所以调用了成功方法作为回调,然后.done()在控制台中抛出错误而不会破坏任何内容(如undefined is not a function)。因此,在这种情况下,控制台中出现错误,只有一个回调函数被调用。

使用 jQuery 1.4.4进行演示jsfiddle

在控制台中:

  

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

  

1 log Object(来自通话的数据)