2

こんにちは、loadData 関数からオブジェクトを返そうとしていますが、FF では "obj is not defined" が表示され、chrome では "Uncaught ReferenceError" が表示されます。 「「obj」のスコープはグローバルである必要があり、json 応答からデータを返す必要があります。Javascript が初めてなので、どこが間違っているのかわかりません。助けてくれてありがとう。

function loadData()
{.....
  xmlhttp.onreadystatechange=function(){
    if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
      personInfo=xmlhttp.responseText;
      obj = JSON.parse(personInfo);
      alert(obj[2].name);
    }
  };

  return obj;//"obj is not defined" in FF and "Uncaught ReferenceError" in chrome      

}



<h2>AJAX</h2>
<button type="button" onclick="loadData()">Request data</button>
<div id="myDiv"></div>

....
4

3 に答える 3

4

これは、onreadystatechange関数が非同期であるためです。次のようなことをする必要があります:

function loadData(callback) {
  xmlhttp.onreadystatechange=function() {
    ...
    callback(data);
  }
}
于 2012-04-29T01:30:00.357 に答える
1

loadData 関数から obj を返していますが、その関数が返すとき、obj はまだ定義されていません。コールバック関数自体の中で obj を使用して何かを行う必要があります。おそらく、データを実際に処理して何かを行う 3 番目の関数に渡します。

于 2012-04-29T01:31:53.117 に答える
1

AJAX 呼び出しは非同期です。コードは応答を待ちません。応答を待っている間、次のコードを実行し続けます。これは、return obj実際にデータが入力される前に が実行されることを意味します。

あなたがすべきことは、基本的にデータが受信されたときに実行する関数である「コールバック」を渡すことです:

function loadData(callback){
    ...
    xmlhttp.onreadystatechange=function(){
        if (xmlhttp.readyState==4 && xmlhttp.status==200){

            //execute callback, passing it the parsed JSON
            callback(JSON.parse(xmlhttp.responseText));
        }
    } 
    //execute send here
}

//call loadData, passing it a callback function
//this function will be executed when response is received
//and the data will be provided as "returnedData"
loadData(function(returnedData){
    //use data
    alert(returnedData[2].name);
});
于 2012-04-29T01:33:40.713 に答える