Javascript Jquery-Ajax-beforeSend和success,error&;完成

Javascript Jquery-Ajax-beforeSend和success,error&;完成,javascript,jquery,ajax,recursion,Javascript,Jquery,Ajax,Recursion,我对多个ajax函数有一个问题,第二个ajax帖子的beforeSend在第一个ajax的complete函数之前执行 我在发送之前添加到占位符的加载类用于第一个ajax调用。但是,在第一个ajax请求完成后不久,该类将被删除,并且不再在第二个和以后的调用中追加(记住递归调用) 调试时,它显示第二个ajax调用的beforeSend函数首先被调用,而第一个ajax调用的complete函数稍后被调用。这是显而易见的,因为从第一个ajax调用插入到页面中的返回数据将启动第二个调用 简言之,这是混乱

我对多个ajax函数有一个问题,第二个ajax帖子的
beforeSend
在第一个ajax的
complete
函数之前执行

我在发送之前添加到占位符的加载类用于第一个ajax调用。但是,在第一个ajax请求完成后不久,该类将被删除,并且不再在第二个和以后的调用中追加(记住递归调用)

调试时,它显示第二个ajax调用的
beforeSend
函数首先被调用,而第一个ajax调用的
complete
函数稍后被调用。这是显而易见的,因为从第一个ajax调用插入到页面中的返回数据将启动第二个调用

简言之,这是混乱的。有什么办法可以解决这个问题吗

功能代码如下所示

function AjaxSendForm(url, placeholder, form, append) {
var data = $(form).serialize();
append = (append === undefined ? false : true); // whatever, it will evaluate to true or false only
$.ajax({
    type: 'POST',
    url: url,
    data: data,
    beforeSend: function() {
        // setting a timeout
        $(placeholder).addClass('loading');
    },
    success: function(data) {
        if (append) {
            $(placeholder).append(data);
        } else {
            $(placeholder).html(data);
        }
    },
    error: function(xhr) { // if error occured
        alert("Error occured.please try again");
        $(placeholder).append(xhr.statusText + xhr.responseText);
        $(placeholder).removeClass('loading');
    },
    complete: function() {
        $(placeholder).removeClass('loading');
    },
    dataType: 'html'
});
}
数据中包含以下javascript/jquery片段,用于检查并启动另一个ajax请求

<script type="text/javascript">//<!--
 $(document).ready(function() {
    $('#restart').val(-1)
    $('#ajaxSubmit').click();
});
//--></script>
//

也许您可以尝试以下方法:

var i = 0;
function AjaxSendForm(url, placeholder, form, append) {
var data = $(form).serialize();
append = (append === undefined ? false : true); // whatever, it will evaluate to true or false only
$.ajax({
    type: 'POST',
    url: url,
    data: data,
    beforeSend: function() {
        // setting a timeout
        $(placeholder).addClass('loading');
        i++;
    },
    success: function(data) {
        if (append) {
            $(placeholder).append(data);
        } else {
            $(placeholder).html(data);
        }
    },
    error: function(xhr) { // if error occured
        alert("Error occured.please try again");
        $(placeholder).append(xhr.statusText + xhr.responseText);
        $(placeholder).removeClass('loading');
    },
    complete: function() {
        i--;
        if (i <= 0) {
            $(placeholder).removeClass('loading');
        }
    },
    dataType: 'html'
});
}
var i=0;
函数AjaxSendForm(url、占位符、表单、附加){
var data=$(form).serialize();
append=(append==undefined?false:true);//不管怎样,它将只计算为true或false
$.ajax({
键入:“POST”,
url:url,
数据:数据,
beforeSend:function(){
//设置超时
$(占位符).addClass('loading');
i++;
},
成功:功能(数据){
如果(附加){
$(占位符).追加(数据);
}否则{
$(占位符).html(数据);
}
},
错误:函数(xhr){//如果发生错误
警报(“发生错误,请重试”);
$(占位符).append(xhr.statusText+xhr.responseText);
$(占位符).removeClass('loading');
},
完成:函数(){
我--;

如果(i这实际上更容易:

或者,您可以向每个结果回调传递
bind
函数;参数的顺序是:
(成功,失败)
。只要指定一个至少包含1个参数的函数,就可以访问响应。因此,例如,如果要检查响应文本,您可以简单地执行以下操作:

$.ajax(
            type: "GET",
            url: @get("url") + "logout",
            beforeSend: (xhr) -> xhr.setRequestHeader("token", currentToken)
        ).failure((response) -> console.log "Request was unauthorized" if response.status is 401

感谢更新,我更新了我的代码,并用新定义的、承诺的函数fail、done和always替换了success、error和complete回调函数。但是,它们没有解决问题,因为问题与我应用@Nathan PI提供的解决方案时有所不同。我尝试了你的解决方案,它给了我一个惊喜esults.首先,我在beforeSend中使用了var requestNumber=0和++it,并在complete/always中对其进行了检查。它显示requestNumber==2和--results在check中返回false的1,并且加载类没有被删除。但是它从未被删除,因为我不知道为什么,它正在为整个序列生成一个额外的请求。现在找到了罪魁祸首,我认为很容易解决或发布错误请求。如果函数失败,那么它将进入错误和完成状态。如果我只希望它在完成状态下运行,我是否可以在完成状态下返回1,这样它就不会进入错误状态?
$.ajax(
            type: "GET",
            url: @get("url") + "logout",
            beforeSend: (xhr) -> xhr.setRequestHeader("token", currentToken)
        ).failure((response) -> console.log "Request was unauthorized" if response.status is 401