2015-08-19 81 views
0

我有2個參數對象 - Obj3D,名稱和 我想通過名稱來加載對象:JS功能參數+ three.js所

function load3DObjectByName(obj, loader) 
{ 
    loader.load(
     "resources/3D/meshes.dae", 
     function(collada) { 
      obj.Obj = collada.scene.getChildByName(obj.Name, true); 
      window.alert(obj.Obj["name"]); // obj.Obj != undefined 
    } 
    ); 
    window.alert(obj.Obj["name"]); // obj.Obj == undefined 
} 

但obj.Obj是窗臺未定義裝貨後...裝載機= ColladaLoader。

+0

看起來'load'是異步的,是嗎? – MinusFour

+0

如果我檢查obj.Obj函數(collada){} - 在那裏加載,但外部(在load3DObjectByName函數中)仍然是空的... –

回答

0

如果loader.load是異步的,那麼不要指望在函數調用後立即填充對象。換句話說:

load3DObjectByName(obj, loader); 
//obj might not be ready yet. 

使用承諾代替或繼續使用CPS。

function load3DObjectByName(obj, loader) 
{ 
    return new Promise(function(resolve) { 
     loader.load(
      "resources/3D/meshes.dae", 
      function(collada) { 
       obj.Obj = collada.scene.getChildByName(obj.Name, true); 
       resolve(obj); 
      } 
     ); 
    }); 
} 

var prom = load3DObjectByName(obj, loader); 
prom.then(function(obj){ 
    //obj here is finished and can be used now. 
}); 
+0

是的!!!非常感謝你!我整晚都在這個問題上度過。 –

0

正如MinusFour指出的那樣,loader.load是異步的。這也就意味着 - 代碼是得到儘可能

loader.load(..., youranonymousfunctionReference) 
window.alert(... 
// and then from eventloop 
youranonymousfunctionReference. 

所以當window.alert叫做匿名函數沒有被執行,因此obj爲undefined執行。