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);它会通过错误并打印出“测试”。但是如果我取消注释它,它就会卡在那里并且不会打印任何东西。为什么要这样做?我该如何解决它,以便它实际上将给定的数据推送到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

this不是OBJMesh回调中的新实例,而是XMLHttpRequest.

首先在定义回调之前引用所需的对象:

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 回答