0

Javascript 関数から JSON オブジェクトを設定し、それを別の関数のパラメーターとして使用しようとしていますが、この obj には関数外の値がありません。関数の外でこのjsonオブジェクトを作成しました:

var obj = {"Level":0, "Index":0, "Count":0, "AABB":[], "Point":[], "Children":[]};

それで

function loadXMLDoc()
  {  
   if(window.XMLHttpRequest){
      xmlhttp=new XMLHttpRequest();
   } else {
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
   }
   xmlhttp.onreadystatechange=function(){
      if(xmlhttp.readyState==4 && xmlhttp.status==200){
        var string = xmlhttp.responseText;
        obj = JSON.parse(string);
        document.getElementById("myDiv").innerHTML = obj.Children;
      }
   }
   xmlhttp.open("GET","r0.json",true);
   xmlhttp.send();

   return obj;  
  }

しかし、関数を呼び出して obj を渡すと、次のようになります。

    var obj = loadXMLDoc();
    initGL(canvas);
    initShaders();
    initBuffers(obj);

関数 initBuffers に値を渡すことはできません。なぜそれが起こったのですか?どうすれば解決できますか?ありがとう。

4

4 に答える 4

2

パラメーターとして渡すことができないと言っているのは何を意味するのかわかりませんが、 を呼び出した後、ハンドラーが非同期で呼び出されるobjことを理解する必要があります。おそらく、JSON 応答が解析されるときに、ハンドラー内から初期化ルーチンを呼び出す必要があります。onreadystatechangeinitBuffers

于 2013-04-06T03:46:14.450 に答える
0

@akonsuが言ったように、loadXMLDoc関数の戻り値はajax呼び出しが完了する前に呼び出されるため、その呼び出しは非同期であるため、ajaxを実行すると、その呼び出しで別のプロセスが作成され、現在のプロセス(関数loadXMLDocを使用)は気にせずに動作します。呼び出しが終了すると onreadystatechange 関数内のコードのみが呼び出されるため、次のように ajax onreadystatechange 内のコードを実行する関数コールバックを作成することをお勧めします。

function loadXMLDoc()
  {  
   if(window.XMLHttpRequest){
      xmlhttp=new XMLHttpRequest();
   } else {
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
   }
   xmlhttp.onreadystatechange=function(){
      if(xmlhttp.readyState==4 && xmlhttp.status==200){
        var string = xmlhttp.responseText;
        var obj = JSON.parse(string);
        document.getElementById("myDiv").innerHTML = obj.Children;
        SOME_CALLBACK(obj)  
      }
   }
   xmlhttp.open("GET","r0.json",true);
   xmlhttp.send();

   //return obj;  no needed any more
  }

function SOME_CALLBACK(obj){
    initGL(canvas);
    initShaders();
    initBuffers(obj);
}

このように、SAVE_CALLBACK 関数は非同期の obj データを受け取り、これらを処理します。

于 2013-04-06T04:13:02.907 に答える
0

関数内の変数はその特定の関数にバインドされており、変数を含む関数内にない場合、または変数がグローバルに設定されている場合を除き、関数の外部からアクセスすることはできません。

少数のオブジェクトのみの汚い方法は、グローバル コンテナーを使用するスパンを作成することです。

于 2013-04-06T04:23:43.237 に答える
0

@akonsu が言ったこと (の同期の性質onreadystatechange)のためloadXMLDoc()、init 関数が実行されても、まだ実行されます。その結果、obj変数は実行時にまだ定義されていませんinitBuffers(obj)

簡単な解決策は、コールバックを に追加することloadXMLDoc()です:

function loadXMLDoc(objParsed)
  {  
   ...
   xmlhttp.onreadystatechange=function(){
      if(xmlhttp.readyState==4 && xmlhttp.status==200){
        var string = xmlhttp.responseText;
        obj = JSON.parse(string);
        document.getElementById("myDiv").innerHTML = obj.Children;
        objParsed(obj);
      }
   }
   xmlhttp.open("GET","r0.json",true);
   xmlhttp.send(); 
  }

そしてそれを次のように使用します(の結果に依存しないinitGL()と仮定して):initShaders()initBuffers()

loadXMLDoc(initBuffers);
initGL(canvas);
initShaders();

余談ですが、次の値を変更しているようですobj

obj = JSON.parse(string);

したがって、後でアクセスしようとすると、有効な JSON であり、ルートから離れたプロパティを持ってobj.Childrenいない限り、存在しません。また、スクリプトの先頭で設定した値を完全に上書きします。xmlhttp.responseTextChildren

于 2013-04-06T04:06:35.937 に答える