如何等待1 ajax调用结束在循环中进行另一个ajax调用?

时间:2011-08-25 14:09:03

标签: javascript ajax

我在循环中调用一个函数来进行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()

这个中的任何观点??

2 个答案:

答案 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请求。它将使您的应用程序显得更快,因为它不必等待每个复选框都经历整个请求/响应周期。