Javascript Jquery-Ajax-beforeSend和success,error&;完成
我对多个ajax函数有一个问题,第二个ajax帖子的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调用插入到页面中的返回数据将启动第二个调用 简言之,这是混乱
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