0

この時点では Json や jquery は使用しません - プレーンなバニラ Javascript の回答のみをお願いします (SE でこの問題に対する回答をたくさん見つけましたが、それらにはすべて Jquery または Json が含まれています)。

window.onload=function(){...イベント ハンドラー内に 2 つの関数があります。最初の関数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;
  }
}

2 番目の関数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 呼び出しを完了して配列に値を設定する前に、スクリプトが 2 番目の関数 に入ることです。2つの機能の間にタイマーを組み込むことでそれを思い出すことができますが、それは不器用です。Ajax 呼び出しが完了し、配列に値が入力されるまで、アクセスしshowNextName()たり離れたりしないようにするためのより良い方法はありますか?window.onload

4

2 に答える 2

1

showNextName成功のコールバックを呼び出します()populateArrayreadyStateAJAXは非同期であるため、関数で行ったように、が4の場合、それに応じてロジックを実行する必要があり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

唯一の賢明な解決策は、後者がその作業を完了したら、showNextNameinsideから呼び出すことです。populateArray

于 2013-02-19T13:59:14.113 に答える