three.js中Loader对象的Parse方法允许您设置一个在解析过程完成时调用的回调函数。这个回调被称为传递给它一个唯一的参数,这个参数就是被解析的对象。
我的问题是,我需要将另一个参数传递给回调。这是因为我在循环中使用了parse方法,并且我想创建许多回调,每个回调都有一个特定的变量值。
如果我在循环中设置了这个值,但是在回调之外,当回调不可避免地被执行时,显然这个值总是在循环中设置的最后一个。
代码如下:
for(var foldcont_index in foldcont) {
var foldit= foldcont[foldcont_index];
if(foldit.isDirectory()) { loadBFiles(fold+'/'+foldit.name); }
if(foldit.isFile()) {
var buigltf= fs.readFileSync(fold+'/'+foldit.name, 'utf8');
loader.parse(
buigltf,
undefined,
function(o) {
var oname= // !!! before issue with foldit.name
objectstank['xxx_'+oname]= o;
loadpoint= loadpoint+loadpercentage;
loadbar.set(loadpoint);
if(loadpoint>= 100) { document.getElementById("load-bar").style.display= 'none'; },
undefined
}
);
}
}有人能帮我找到解决方案吗?
发布于 2019-06-18 23:33:08
阅读closures in Javascript上的内容
与C/C++之类的语言不同,在JavaScript中“关闭变量”很简单,因此在JavaScript中永远不需要额外的回调参数,因为您总是可以使用闭包在回调中“关闭”需要访问的任何变量
在你的情况下
for(var foldcont_index in foldcont) {
var foldit= foldcont[foldcont_index];
if(foldit.isDirectory()) { loadBFiles(fold+'/'+foldit.name); }
if(foldit.isFile()) {
var buigltf= fs.readFileSync(fold+'/'+foldit.name, 'utf8');
loader.parse(
buigltf,
undefined,
function(oname) {
return function(o) {
var oname= // !!! before issue with foldit.name
objectstank['xxx_'+oname]= o;
loadpoint= loadpoint+loadpercentage;
loadbar.set(loadpoint);
if(loadpoint>= 100) { document.getElementById("load- bar").style.display= 'none'; }
};
}(foldit.name),
undefined
);
}
}也许行得通。(我可以读懂你的代码)。据我所知,这不是Three.js中的Loader对象。有很多XXXLoader对象。不知道你用的是哪一个。
此模式
function(var1, var2, var3) {
return function() {
// do something with var1, var2, var2
};
}(value1, value2, value2);是关闭值的常见模式。该代码是一个函数,它返回一个在var1、var2和var3上“关闭”的函数。
因此,您可以将返回的函数传递给回调。长手示例
function makeCallback(var1, var2, var3) {
return function() {
console.log(var1, var2, var3);
};
}
const fn = makeCallback('Hello', 'World', '!');
setTimeout(fn, 1000);
内联版本
for (let i = 1; i <= 4; ++i) {
setTimeout(function(var1) {
return function() {
console.log(var1);
};
}(i), i * 500);
}
https://stackoverflow.com/questions/56635189
复制相似问题