babylonjs 打字稿竞争条件?

babylonjs typescript race conditions?

我一直在试验 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])
    });
}

控制台日志打印为 "mesh set: undefined"。我假设是因为 import mesh 在 "i" 甚至有机会被设置之前在它自己的线程中执行回调函数?但是,我无法理解如何在回调中简单地执行控制台打印时仍然不会设置 "i" and/or 模型列表。当我执行控制台打印时:

models[1] 

在同一个回调中,我能正确看到值吗?没有意义:(

有人知道导入网格在线程方面的情况吗? babylonjs 是否有等待线程的最佳实践?我尝试使用 scene.executewhenready 但我似乎仍然无法在回调之外的变量中存储和检索任何内容。

I'm assuming because import mesh executes the callback function in its own thread before "i" has even had a chance to be set

没有。请注意,JavaScript 是(主要是……在这种情况下肯定是) 单线程

When I do a console print of: models[1] within the same callback

这是因为变量 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