Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript如何从回调函数设置成员变量?_Javascript - Fatal编程技术网

JavaScript如何从回调函数设置成员变量?

JavaScript如何从回调函数设置成员变量?,javascript,Javascript,我有一个自定义对象,需要在后台使用XMLHttpRequest异步加载文件 我已经设置了请求并正确地调用它,得到了对对象原型中定义的正确方法的响应。但我相信这个对象不是正确对象的“实例”。例如: 在Obj A上调用成员函数。 函数执行并启动XMLHttpRequest。 XMLHttpRequest正确调用onload函数。 在设置的onload函数中,我更改了Obj a的一个属性(如果您想知道的话,只是一个布尔值) 这就是问题发生的地方,布尔值实际上并没有改变为预期值。这有什么办法吗 编辑(已

我有一个自定义对象,需要在后台使用XMLHttpRequest异步加载文件

我已经设置了请求并正确地调用它,得到了对对象原型中定义的正确方法的响应。但我相信这个对象不是正确对象的“实例”。例如:

在Obj A上调用成员函数。 函数执行并启动XMLHttpRequest。 XMLHttpRequest正确调用onload函数。 在设置的onload函数中,我更改了Obj a的一个属性(如果您想知道的话,只是一个布尔值) 这就是问题发生的地方,布尔值实际上并没有改变为预期值。这有什么办法吗

编辑(已添加代码段):

前两个功能是工作“不正常”的回调。后两个从“主线程”调用。这些命令启动HTTP请求

(添加调用这些函数的代码。)

构造此对象的代码是:

this.entityArray.push(new Custom3DObject(sphere.verts, sphere.inds, sphere.norms));
我在这里找到了答案:

基本上,在定义/设置回调函数“onload”之前,它说要定义一个变量,var local=this;第一。现在我的函数如下所示:

Entity.prototype.getAndCompileVertexShader = function(filename)
{
    var request = new XMLHttpRequest();
    request.open("GET", "shaders/" + filename, true);
    request.responseType = "text";

    var local = this;

    request.onload = function(e) {

        console.log("RECEIVED VERTEX SHADER");
        local.vertexShaderHandle = GL.createShader(GL.VERTEX_SHADER);
        GL.shaderSource(local.vertexShaderHandle, e.target.response);
        GL.compileShader(local.vertexShaderHandle);

        local.vertexShaderCompiled = true;

    }
    request.send();
}

并在回调函数中使用该新变量访问成员(实例)数据。奇怪。

查看代码会很有帮助。使用一些代码更容易理解您的想法…添加了代码段。您调用“类”的代码在哪里?添加了构造类并调用函数的代码。
this.entityArray.push(new Custom3DObject(sphere.verts, sphere.inds, sphere.norms));
Entity.prototype.getAndCompileVertexShader = function(filename)
{
    var request = new XMLHttpRequest();
    request.open("GET", "shaders/" + filename, true);
    request.responseType = "text";

    var local = this;

    request.onload = function(e) {

        console.log("RECEIVED VERTEX SHADER");
        local.vertexShaderHandle = GL.createShader(GL.VERTEX_SHADER);
        GL.shaderSource(local.vertexShaderHandle, e.target.response);
        GL.compileShader(local.vertexShaderHandle);

        local.vertexShaderCompiled = true;

    }
    request.send();
}