2012-08-17 6 views
5

In Three.js, se ho più chiamate al JSONLoader per caricare più oggetti simili a questo (esempio semplificato):Three.js JSONLoader callback

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); 
    } 
} 

Come è possibile determinare che ingranano è stato restituito durante la richiamata , specialmente quando arrivano frequentemente fuori servizio?

Sto provando a gestire più mesh restituite con una singola funzione di callback generica. C'è qualche proprietà nella geometria restituita che indica il nome file originale su cui posso testare?

O forse c'è un modo più elegante? Forse la creazione di un nuovo oggetto THREE.JSONLoader per ogni chiamata potrebbe aiutare la funzione di callback a determinare quale maglia è arrivata?

Apprezzo qualsiasi aiuto/idee! Grazie!

risposta

7

beh, c'è un modo più generico di ciò che WestLangley propone.

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

poi

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

In questo modo, è possibile aggiungere un identificativo su ogni file caricato.

+0

fantastico ... Sono stato in grado di farlo funzionare. Non avrei mai pensato di restituire una funzione all'interno di una funzione. Sono davvero curioso di sapere cosa sta succedendo qui ... Puoi spiegare un po 'come/perché questo funziona o indicarmi la direzione di qualche documentazione? – Dev

+4

@Dev Questo è ciò che viene chiamato un [chiusura] (https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Closures). Quando 'meshloader (" mesh1.js ")' viene passato come argomento, viene eseguito direttamente (a causa della presenza di parentesi). Quando viene eseguito, restituisce un'altra funzione. Quindi è esattamente come se avessi passato la funzione anonima 'function (geometry) {...}' come argomento, eccetto che questa funzione anonima sarà eseguita come un callback in un contesto in cui la variabile 'fileName' è definita e ha il valore '" mesh1.js "'. – Pioul

0

Che ne dici di qualcosa del genere?

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

Poi,

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

Il id può essere il nome di maglia, se si preferisce che.

+0

Ah, ho seguito questo percorso ... sicuramente funziona con una costante, come "1" o "2" ma il problema sembra essere che quando "1" e "2" vengono sostituiti con una variabile, dì "x", la variabile viene valutata solo * dopo * viene restituito il callback. Non riesco a trovare un modo per passare una variabile per creareScene con un valore determinato prima che loader.load venga chiamato ... ha senso? problema di portata? problema temporale? – Dev

+0

Questa è una risposta alla tua domanda. Ora stai facendo una domanda diversa. Forse puoi pubblicare un nuovo problema. – WestLangley