babylonjs打字比赛条件?

时间:2015-09-21 03:39:08

标签: javascript typescript race-condition babylonjs

我一直在尝试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但我仍然无法在回调之外的变量中存储和检索任何内容。

1 个答案:

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