我在循环中调用一个函数来进行ajax调用。在进行另一次通话之前,我需要等待1 ajax呼叫结束。代码就像 -
function chkAll(field, markr) {
var string = "document.forms[0].pCheckBox" + markr + ".checked";
var temp = eval(string);
if (temp) {
if (field.length > 1) {
for (i = 0; i < field.length; i++) {
field[i].checked = true;
decide(field[i].id, field[i].value);
}
}
else {
field.checked = true;
decide(field.id, field.value);
}
}
}
进行ajax调用的函数如下:
function decide(code, dataString) {
if (document.getElementById(code).checked) {
var url = "../PRODUCT/PCProcess_Ajax.jsp?CIMS_CSRFTOKEN=" + getTokenFromSessionId();
if (window.ActiveXObject) {
httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
} else if (window.XMLHttpRequest) {
httpRequest = new XMLHttpRequest();
}
httpRequest.open("POST", url, true);
httpRequest.onreadystatechange = processRequest;
httpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
varparameters = "pScreenId=ClmReports&pEventCode=NFACREATE&pDataString=" +
dataString + "&pSelectName=" + code;
httpRequest.send(parameters);
} else {
var url = "../PRODUCT/PCProcess_Ajax.jsp?CIMS_CSRFTOKEN=" + getTokenFromSessionId();
if (window.ActiveXObject) {
httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest) {
httpRequest = new XMLHttpRequest();
}
httpRequest.open("POST", url, true);
httpRequest.onreadystatechange = processRequest;
httpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
var parameters = "pScreenId=ClmReports&pEventCode=NFADELETE&pDataString=" + dataString;
httpRequest.send(parameters);
}
}
在processRequest()
我只是存储httpRequest.responseText
并使用它。我想确保在完成预设1之后调用一个decide()
。
这个中的任何观点??
答案 0 :(得分:1)
使用排队系统。在某个地方有一个数组,你可以推送一个url / data结构(基本上是一个作业队列),以及一个在ajax请求未完成时标记的var。将todo数据推送到数组后,调用一个函数(doNextAjax()?)来检查标志的状态,如果没有未完成的工作,则启动ajax请求。如果有一个出色的工作,该功能只会返回。
在ajax调用的成功处理程序中,只需调用此doNextAjax()函数,即可启动下一个ajax调用。
这可以让你模拟同步请求,而不会像真正的同步请求那样实际占用浏览器。
确定。一些示例代码。可能不会起作用,因为我已经脱离了我的头脑,但是......
var jobQueue = [];
var ajaxActive = false;
function addToQueue(url, data) {
jobQueue.push({'url' : url, 'data': data});
doAjax();
}
function doAjax() {
if (ajaxActive) { return; } // ajax request still outstanding
if (jobQueue.length = 0) { return; } // no more work to do
todo = jobQueue.pop();
ajaxActive = true;
$.ajax({
url: todo.url,
data: todo.data,
success: function(returnedata) {
... do whatever you need with the returned data ...
ajaxActive = false;
doAjax(); // schedule another job, if need be.
},
error: function(e) {
... handle error ...
ajaxActive = false;
doAjax(); // schedule next job, if need be
}
});
}
答案 1 :(得分:0)
你应该重写它,它会使你的逻辑更简单。您正在尝试与异步混合并匹配。如果每个复选框必须调用1次,则应重写代码以使xmlhttprequest的成功/失败回调继续到下一个复选框。由于您具有复选框的序号位置,因此您可以在成功或失败时继续执行下一个序号位置。
老实说,最好的办法是将其更改为一个包含所有数据的Web请求。它将使您的应用程序显得更快,因为它不必等待每个复选框都经历整个请求/响应周期。