1

しばらくの間、配列にデータを追加しようとしましたが、うまくいきません。次のコードがあります。

function OBJMesh(file)
{
    this.modelVertex = [];
    this.modelColor = [];
    var that = this;
    var rawFile = new XMLHttpRequest();
    rawFile.open("GET", file, true);
    rawFile.onreadystatechange = function ()
    {

        if(rawFile.readyState == 4)
        {
            if(rawFile.status === 200 || rawFile.status === 0)
            {
                var allText = rawFile.responseText;
                var lines = allText.split("\n");


                for(var i = 0; i < lines.length; i ++)
                {
                    var lineData = lines[i];
                    var lineString = lineData.split(" ");

                    if(lineString[0] === "v")
                    {

                        var x = parseFloat(lineString[1]);
                        var y = parseFloat(lineString[2]);
                        var z = parseFloat(lineString[3]);

                        /*
                        this.modelVertex.push(x);
                        this.modelVertex.push(y);
                        this.modelVertex.push(z);

                        this.modelColor.push(0.0);
                        this.modelColor.push(0.0);
                        this.modelColor.push(0.0);
                        this.modelColor.push(1.0);
                        */

                        that.modelVertex.push(10.0);

                        //document.getElementById("textSection").innerHTML = "testing";
                    }

                }
            }
        }
    }

    rawFile.send();

}

OBJMesh.prototype.getModelVertex = function ()
{
    return this.modelVertex;
};

OBJMesh.prototype.getModelColor = function ()
{
    return this.modelColor;
};

コメントアウトするthis.modelVertex.push(10.0);と、エラーが渡され、「testing」が出力されます。しかし、コメントを外すと、そこで動かなくなり、何も出力されません。なぜこれを行うのですか?this.modelVertex実際に指定されたデータを配列にプッシュするようにするにはどうすればよいですか?

どうもありがとう

編集: dystroy が何をすべきかを教えてくれた後、コードを編集しました。OBJMesh コンストラクター (上記) で値を出力しようとすると機能しますが、メイン関数でオブジェクトを作成してこれを実行しようとすると (以下に示します)何も印刷しません。

var cubeModel;

function main()
{
    cubeModel = new OBJMesh("file:///Users/Danny/Desktop/3DHTMLGame%202/cube.obj");

    document.getElementById("textSection").innerHTML = cubeModel.getModelVertex();
}
4

1 に答える 1

5

thisOBJMeshは、コールバック内の の新しいインスタンスではなく、 XMLHttpRequest.

callback を定義する直前に目的のオブジェクトを参照することから始めます。

var that = this;
rawFile.onreadystatechange = function ()

それを使用します:

that.modelVertex.push(10.0);

あなたの編集の質問への回答:

コンストラクターに非同期リクエストが含まれています。つまり、アレイはすぐには利用できませんが、後で利用できます。

解決策は、コンストラクターにコールバックを渡すことです。

function OBJMesh(file, doAfterInit) {
    this.modelVertex = [];
    this.modelColor = [];
    var that = this;
    var rawFile = new XMLHttpRequest();
    rawFile.open("GET", file, true);
    rawFile.onreadystatechange = function () {
        if(rawFile.readyState == 4)
        {
            if(rawFile.status === 200 || rawFile.status === 0)
            {
                var allText = rawFile.responseText;
                var lines = allText.split("\n");
               for(var i = 0; i < lines.length; i ++)
                {
                    var lineData = lines[i];
                    var lineString = lineData.split(" ");
                    if(lineString[0] === "v"){
                        that.modelVertex.push(10.0);
                        if (doAfterInit) doAfterInit();
                    }
                }
            }
        }
    }
    rawFile.send();
}

...


cubeModel = new OBJMesh("file:///Users/Danny/Desktop/3DHTMLGame%202/cube.obj", function() {
    document.getElementById("textSection").innerHTML = cubeModel.getModelVertex();
});

しかし、ここでクラスを開催するのは賢い考えではないようです。

于 2013-01-23T16:15:07.837 に答える