【问题标题】:JQuery ajax success fired twice, because of .done callback由于 .done 回调,JQuery ajax 成功触发了两次
【发布时间】: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


【解决方案1】:

就像我在 cmets 中所说的那样,我认为以前您的 jQuery 版本 低于 1.5(没有实现 .done())所以成功方法被调用为回调然后.done() 在控制台中抛出一个错误而不破坏任何东西(如undefined is not a function)。所以在这种情况下,你在控制台中有一个错误,并且只调用了一个回调函数。

jQuery 1.4.4 演示:jsfiddle

在控制台中:

1 个错误undefined is not a function(因为.done()

1 条日志Object(来自通话的数据)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 2018-02-24
    • 2013-03-20
    • 1970-01-01
    • 2017-01-16
    相关资源
    最近更新 更多