0

在这一点上,我不使用 Json 或 jquery - 请仅使用普通的 Javascript 答案(我在 SE 上找到了很多关于这个问题的答案,但它们都包括 Jquery 或 Json)。

window.onload=function(){...我在事件处理程序中有两个函数。第一个函数fillArray(from,to)是以下形式的 Ajax 调用:

function fillArray(from,to){
  request = createRequest();
  if (request == null) {
    return;
  }
  var url= "Ajax_retrieveNames.php?indexFrom=" + from + "&indexTo=" + to;
  request.open("GET", url, true);
  request.onreadystatechange = populateArray;
  request.send(null);
}

function populateArray(){
  var xmlFrag=null;
  if (request.readyState == 4) {
    if (request.status == 200) {
      xmlFrag = request.responseXML;
      for(var i=indexFrom; i<=indexTo; i++){
        fcArray[i]=new Array();
        var f=xmlFrag.getElementsByTagName("first")[i].childNodes[0].nodeValue;
        var l=xmlFrag.getElementsByTagName("last")[i].childNodes[0].nodeValue;
        fcArray[i][0]=f;
        fcArray[i][1]=l;
      }
    }else{
      return;
    }
  }else{
    return;
  }
}

第二个函数showNextName()处理格式化和显示下一个(在本例中为第一个)子数组的元素。此时,var arrayIndex设置为 0:

function showNextName(){
  displayQuestion() // Deals with page formatting
  document.getElementById('firstName').innerHTML=fcArray[arrayIndex][0];
  document.getElementById('lastName').innerHTML=fcArray[arrayIndex][1];
  updateArrayIndex(); // Is a counter that increments the variable arrayIndex
}

showNextName()我的问题是脚本在完成 Ajax 调用和填充数组之前进入了第二个函数。我可以通过在两个函数之间加入一个计时器来解决这个问题,但这很笨拙。有没有更好的方法来确保在 Ajax 调用完成并填充数组之前我们不会进入showNextName()或离开?window.onload

4

2 回答 2

1

调用showNextName您的成功回调 ( populateArray)。由于 AJAX 是异步的,因此您需要在 4 时根据它执行逻辑,readyState就像您在populateArray函数中所做的那样。

function populateArray(){
  var xmlFrag=null;
  if (request.readyState == 4) {
    if (request.status == 200) {
      xmlFrag = request.responseXML;
      for(var i=indexFrom; i<=indexTo; i++){
        fcArray[i]=new Array();
        var f=xmlFrag.getElementsByTagName("first")[i].childNodes[0].nodeValue;
        var l=xmlFrag.getElementsByTagName("last")[i].childNodes[0].nodeValue;
        fcArray[i][0]=f;
        fcArray[i][1]=l;
      }
      showNextName();
    }else{
      return;
    }
  }else{
    return;
  }
}
于 2013-02-19T13:58:56.687 回答
1

唯一明智的解决方案是在后者完成工作后showNextName从内部调用。populateArray

于 2013-02-19T13:59:14.113 回答