Reh*_*nis 29 javascript ajax recursion jquery
我有其中多个AJAX功能的问题beforeSend
的的第二 AJAX柱的前执行complete
所述的功能的第一 AJAX.
我在发送之前添加到占位符的加载类正在为第一个ajax调用工作.但是,在第一个ajax请求完成后不久,该类将被删除,并且永远不会再次追加第二个和更多的调用(记住递归调用).
调试时显示beforeSend
第一个调用第二个ajax调用的complete
函数,稍后调用第一个ajax调用的函数.这是显而易见的,因为从第一个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'
});
}
Run Code Online (Sandbox Code Playgroud)
并且数据包含以下javascript/jquery片段,它检查并启动另一个ajax请求.
<script type="text/javascript">//<!--
$(document).ready(function() {
$('#restart').val(-1)
$('#ajaxSubmit').click();
});
//--></script>
Run Code Online (Sandbox Code Playgroud)
Ser*_* K. 56
也许您可以尝试以下方法:
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'
});
}
Run Code Online (Sandbox Code Playgroud)
这样,如果在beforeSend
语句大于0 之前调用complete
语句i
,那么它将不会删除该类.然后只有最后一个电话才能将其删除.
我无法测试它,让我知道它是否有效.
使用jQuery的promise API实际上要容易得多:
$.ajax(
type: "GET",
url: requestURL,
).then((success) =>
console.dir(success)
).failure((failureResponse) =>
console.dir(failureResponse)
)
Run Code Online (Sandbox Code Playgroud)
或者,您可以将bind
函数传递给每个结果回调; 参数的顺序是:(success, failure)
.只要指定具有至少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
Run Code Online (Sandbox Code Playgroud)