2012-08-17 81 views
5

在three.js所,如果我有多次調用JSONLoader加載這樣的(簡化的示例)的多個對象:three.js所JSONLoader回調

function init() {  
    var loader = new THREE.JSONLoader();  
    loader.load("mesh1.js", createScene);  
    loader.load("mesh2.js", createScene); 
}  

function createScene(geometry) {  
    if (geometry.filename == "mesh1.js") {  
    mesh1 = new THREE.Mesh(geometry, material); 
    scene.add(mesh1);  
    } else if (geometry.filename == "mesh2.js") {  
    mesh2 = new THREE.Mesh(geometry, material); 
    scene.add(mesh2); 
    } 
} 

如何確定齧合已在回調返回特別是當他們經常出現故障時?

我想用一個通用的回調函數來處理多個返回的網格物體。返回的幾何體中是否有一些屬性指示我可以測試的原始文件名?

或者還有更優雅的方式?也許爲每個調用創建一個新的THREE.JSONLoader對象可以幫助回調函數確定哪個網格已經到達?

我欣賞任何幫助/想法!謝謝!

回答

7

那麼WestLangley提出的是一種更通用的方法。

loader.load("mesh1.js", meshloader("mesh1.js")); 
loader.load("mesh2.js", meshloader("mesh2.js")); 

然後

function meshloader(fileName){ 
    return function(geometry){ 
     ... 
    } 
} 

這樣,您就可以在每個加載文件中添加一個標識符。

+0

奇妙...我能夠得到這個工作。我永遠不會想到在函數中返回一個函數。我真的好奇這裏到底發生了什麼......你能解釋一下關於如何/爲什麼這會起作用或者指向某些文檔的方向嗎? – Dev 2012-08-18 01:22:35

+4

@Dev這就是所謂的[封閉](https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Closures)。當'meshloader(「mesh1.js」)'作爲參數傳遞時,它會直接執行(由於括號的存在)。執行時,它會返回另一個函數。所以,就好像你傳遞匿名函數'function(geometry){...}'作爲參數,除了這個匿名函數將作爲一個回調被執行,在上下文中變量'fileName'被定義並且具有值'「mesh1.js」'。 – Pioul 2013-03-23 17:12:13

0

這樣的事情呢?

loader.load("mesh1.js", function(geometry) { createScene(geometry, 1) }); 
loader.load("mesh2.js", function(geometry) { createScene(geometry, 2) }); 

然後,

function createScene(geometry, id) { 
... 
} 

id可以是網名,如果你喜歡這一點。

+0

嗯,我一直在這條路上..確定它的工作原理是一個常數,如「1」或「2」,但問題似乎是當「1」和「2」被一個變量替換時,說「x」,變量只在*回調返回後被評估*。我似乎無法找到一種方法將一個變量傳遞給createScene,並在調用loader.load之前確定一個值...有意義嗎?範圍問題?時間問題? – Dev 2012-08-17 02:59:13

+0

這是你的問題的答案。你現在正在問一個不同的問題。也許你可以發佈一個新問題。 – WestLangley 2012-08-17 08:03:54