2015-09-21 3 views
0

Я экспериментировал с babylonjs, и до сих пор все отлично. Я могу загружать сетки и анимировать их просто отлично, когда все в функции обратного вызова ImportMesh в том же файле. Однако; когда я пытаюсь разделить вещи и сделать что-то простое, как показано ниже, я, кажется, получаю эти условия гонки. Возьмем следующий пример:babylonjs типография условия гонки?

var models = ["brick_wall", "tree1", "person1"] 

for (var i =0;i<models.length;++i) { 


    BABYLON.SceneLoader.ImportMesh(models[i], "models/","tree.babylon", scene, (newMeshes) => { 


     this.meshMap[models[i]] = newMeshes[0] 
     console.log("mesh set:" + models[i]) 
    }); 
} 

Консольный журнал распечатывается как «сетка: неопределенный». Я предполагаю, потому что import mesh выполняет функцию обратного вызова в своем собственном потоке, прежде чем «i» даже успел установить? Однако у меня возникают проблемы с тем, чтобы узнать, как «i» и/или список моделей все еще не будут установлены, когда просто выполняете консольную печать в обратном вызове. Когда я делаю консольный отпечаток:

models[1] 

в пределах одного обратного вызова, я могу видеть значение правильно? Не имеет смысла :(

Кто-нибудь знает, что происходит здесь с импортной сеткой в ​​отношении потоков? Есть ли лучшие методы для babylonjs с ожиданием потоков? Я пробовал использовать scene.executewhenready, но я все еще не могу хранить и получить что-нибудь в переменной вне функции обратного вызова.

ответ

2

Я предполагаю, потому что импорт сетки выполняет функцию обратного вызова в отдельном потоке, прежде чем «я» даже имел шанс быть установлен

Нет Обратите внимание, что JavaScript (в основном ... и определенно в этом случае) single threa ded.

Когда я консольный печать: модели [1] в пределах одной и той же функции обратного вызова

Это происходит потому, что переменная i будет указывать на последнюю значение , который был назначен (models.length) в этом дело.

Примечание: Захват JavaScript закрыт переменная не значение. Поэтому вам нужно создать новую переменную в каждой итерации цикла.

Исправлен код

var models = ["brick_wall", "tree1", "person1"] 

for (var i =0;i<models.length;++i) { 

(function(index){ 
    var i = index; 
    BABYLON.SceneLoader.ImportMesh(models[i], "models/","tree.babylon", scene, (newMeshes) => { 


     this.meshMap[models[i]] = newMeshes[0] 
     console.log("mesh set:" + models[i]) 
    }); 
})(i); 

} 

Вот видео, демонстрирующее этот принцип: https://www.youtube.com/watch?v=hU4cbxpe49Y

+0

Спасибо. Это работает. Поэтому, если я правильно понимаю, это потому, что переменная «i» не является отдельной в области цикла for. Это больше похоже на ссылку, которая обновляется с каждым счетом? Поскольку javascript - это область действия функции, а не область скобок, вот почему работает функция funciton? Я действительно ценю решение, но есть ли «чистый» способ сделать это? – efel

+0

выяснил более чистый способ сделать это с помощью моделей. Для каждого синтаксиса – efel