我一直在尝试babylonjs,到目前为止一切都很棒。当所有内容都在同一文件中的ImportMesh回调函数中时,我能够加载网格并为它们设置动画。然而;当我试图分开并做一些简单的事情时,我似乎得到了这些竞争条件。举个例子:
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])
});
}
控制台日志打印为&#34;网格集:未定义&#34;。我假设因为导入网格在&#34; i&#34;之前在其自己的线程中执行回调函数。甚至有机会被设定?但是,我无法理解如何&#34;我&#34;简单地在回调中进行控制台打印时,仍然不会设置和/或模型列表。当我做控制台打印时:
models[1]
在同一个回调中,我能够正确看到该值吗?没有意义:(
有没有人知道这里有关于线程的导入网格? babylonjs有等待线程的最佳实践吗?我尝试使用scene.executewhenready但我仍然无法在回调之外的变量中存储和检索任何内容。
答案 0 :(得分:2)
我假设因为导入网格在&#34; i&#34;之前在其自己的线程中执行回调函数。甚至有机会被设定
没有。请注意,JavaScript(主要是......在这种情况下肯定是)单线程。
当我在同一个回调
中执行控制台打印:models [1]时
这是因为在这种情况下,变量i
将指向已分配的 last 值(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