Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JQuery ajax成功触发了两次,原因是.done回调_Javascript_Jquery_Ajax - Fatal编程技术网

Javascript JQuery ajax成功触发了两次,原因是.done回调

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); }); } 现

我有一些遗留代码,在一个场景中中止ajax请求&然后在用户响应之后,重新发送该请求

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”)。因此,在本例中,控制台中有一个错误,只调用了一个回调函数。