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
我一直在试验 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