首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将附加参数传递给Three.js loader.parse方法中的回调函数

如何将附加参数传递给Three.js loader.parse方法中的回调函数
EN

Stack Overflow用户
提问于 2019-06-18 00:13:48
回答 1查看 226关注 0票数 0

three.js中Loader对象的Parse方法允许您设置一个在解析过程完成时调用的回调函数。这个回调被称为传递给它一个唯一的参数,这个参数就是被解析的对象。

我的问题是,我需要将另一个参数传递给回调。这是因为我在循环中使用了parse方法,并且我想创建许多回调,每个回调都有一个特定的变量值。

如果我在循环中设置了这个值,但是在回调之外,当回调不可避免地被执行时,显然这个值总是在循环中设置的最后一个。

代码如下:

代码语言: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(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
          }
        );

    }

}

有人能帮我找到解决方案吗?

EN

回答 1

Stack Overflow用户

发布于 2019-06-18 23:33:08

阅读closures in Javascript上的内容

与C/C++之类的语言不同,在JavaScript中“关闭变量”很简单,因此在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对象。不知道你用的是哪一个。

此模式

代码语言:javascript
复制
function(var1, var2, var3) {
   return function() {
      // do something with var1, var2, var2
   };
}(value1, value2, value2);

是关闭值的常见模式。该代码是一个函数,它返回一个在var1var2var3上“关闭”的函数。

因此,您可以将返回的函数传递给回调。长手示例

代码语言:javascript
复制
function makeCallback(var1, var2, var3) {
   return function() {
     console.log(var1, var2, var3);
   };
}

const fn = makeCallback('Hello', 'World', '!');
setTimeout(fn, 1000);

内联版本

代码语言:javascript
复制
for (let i = 1; i <= 4; ++i) {
  setTimeout(function(var1) {
     return function() {
        console.log(var1);
     };
  }(i), i * 500);
}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56635189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档