-2

бьюсь об заклад уже который день. Инициализирую класс:

    constructor(glb, texture, isClickable, isHoverable){
        this.GLB = glb;
        this.texture = texture;
        this.clickable = isClickable;
        this.hoverable = isHoverable;
    this.loader = new Loader();

    this.obj = "LALA";

}

Методом этого класса меняю переменную obj :

addToScene(_scene){
        var texture = this.loader.textureloader.load(this.texture);
        texture.flipY = false;
    var hoverable = this.hoverable;
    var clickable = this.clickable;

    var tester = this.test.bind(this);

    this.loader.gltfloader.load(this.GLB, function(gltf){
        var root = gltf.scene;
        root.traverse( function ( object ){
            if(object.isMesh){
                object.material = new THREE.MeshPhongMaterial({map: texture});
                object.userData.canHover = hoverable;
                object.userData.clickable = clickable;
                object.userData.basicColor = object.material.color.getHex();
                tester(object);
            }
        });

        _scene.add(root);
    });

}

test(object){
    this.obj = object;
}

Ну, точнее двумя методами, меняет переменную именно функция test(object). В итоге эта переменная не меняется, больше всего путает меня то, что когда я вывожу в консоль объект целиком, то в поле obj информация записана верно, то что мне нужно. Но когда я обращаюсь к конкретному полю этого класса, в выводе получаю значение, которое я задавал при инициализации этого класса. Вопрос: Видимо, я не правильно изменяю переменную класса. Как правильно изменять переменную класса, чтобы она менялась у самого экземпляра класса? Скрины с выводом и кодом приложу. Всем заранее спасибо за ответы. Вывод консоли

Код, класса

Упростил немного, здесь в сниппете я не имею возможность загрузить локальный url моего glb файла, но я произвел те же манипуляции в функции, которая отвечает за ошибки. В прочем это не важно, из кода видно, что я меняю переменную obj внутри функции загрузки, но на выходе я получаю не измененное значение.

class Object {
  constructor() {
    this.obj = "Init Value";
  }

someMethod() { var loader = new THREE.GLTFLoader(); var obj = this.obj; loader.load("", function(gltf) {}, function(process) {}, function(error) { console.log(obj) obj = "Changed Value"; }); console.log(obj); }

}

var Object1 = new Object(); Object1.someMethod();

<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r121/three.min.js" integrity="sha512-yNJzAsg5JyP91u+sLHlUDULMBd3hmEiVkYeeN1cQBKaLZ7EyT6oH2u5THNIRM2Fu6VKcZJv+F/QAp1h/qzy9Ow==" crossorigin="anonymous"></script>
<script src="https://cdn.rawgit.com/mrdoob/three.js/master/examples/js/loaders/GLTFLoader.js"></script>
  • Пожалуйста, уточните вашу конкретную проблему или приведите более подробную информацию о том, что именно вам нужно. В текущем виде сложно понять, что именно вы спрашиваете. – Дух сообщества Mar 20 '22 at 17:04
  • @Духсообщества Изменил. – Илья Мощенков Mar 20 '22 at 17:34
  • Я попрошу вас предоставить исполняемый минимальный код (лучше если вы этот минимальный код предоставите в виде SO Code Snippet). Потому что так трудно понять что именно не так, где вы вызываете ваши console.log, как именно вызывается сам класс и многое другое. Если я сейчас напишу простой класс, где один метод ставит новое значение полю класса, то это отработает как часы :) – EzioMercer Mar 20 '22 at 18:16
  • @EzioMercer Упростил немного, здесь в сниппете я не имею возможность загрузить локальный url моего glb файла, но я произвел те же манипуляции в функции, которая отвечает за ошибки. В прочем это не важно, из кода видно, что я меняю переменную obj внутри функции загрузки, но на выходе я получаю не измененное значение. – Илья Мощенков Mar 20 '22 at 20:32
  • Проблема в том, что ваша функция loader.load работает асинхронно и вам надо дождаться завершения работы этой ф-ии. @Qwertiy уже показал как обойти эту проблему – EzioMercer Mar 21 '22 at 01:42

1 Answers1

0

class Object {
  constructor() {
    this.obj = "Init Value";
  }

someMethod() { var loader = new THREE.GLTFLoader(); var me = this

new Promise(function (resolve) {
  loader.load("", function(gltf) {}, function(process) {}, function(error) {
    console.log(me.obj)
    me.obj = "Changed Value";
    resolve()
  });
}).then(function () {
  console.log(me.obj);
})

} }

var Object1 = new Object(); Object1.someMethod();

<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r121/three.min.js" integrity="sha512-yNJzAsg5JyP91u+sLHlUDULMBd3hmEiVkYeeN1cQBKaLZ7EyT6oH2u5THNIRM2Fu6VKcZJv+F/QAp1h/qzy9Ow==" crossorigin="anonymous"></script>
<script src="https://cdn.rawgit.com/mrdoob/three.js/master/examples/js/loaders/GLTFLoader.js"></script>
Qwertiy
  • 123,725