Om jag förstår det rätt, kommer du att vilja göra något så här:
var positions = this.getPositions(function(positions) {
console.log(positions[0]);
});
Det vill säga, du kommer att vilja skriva "getPositions" på ett sätt så att den accepterar en enda callback-parameter som anropas när positionerna har laddats framgångsrikt och passerat positionsarrayen. I getPositions du kan kontrollera om positionerna redan har laddats, och i så fall direkt anropa återuppringningen. Annars lägger du till dem i en kö av återuppringningar (t.ex. this.positionsLoadedCallbacks ), genom vilken du itererar efter att alla positioner har laddats (jag tror att det skulle vara någonstans i din load funktion nära me.orderPositions() ).
Till exempel din getPositions funktionen kan se ut så här:
getPositions : function(callback) {
if(this.positions !== null) {
callback(this.positions);
return;
}
this.positionsLoadedCallbacks.push(callback);
},
Någonstans efter att du är säker på att positionerna har laddats (dvs. i loadJSON success callback) måste du sätta något så här:
for(var i=0; i < this.positionsLoadedCallbacks.length; i++) {
this.positionsLoadedCallbacks[i](this.positions);
}
Och glöm inte att initiera this.positionsLoadedCallbacks :)
console.log-trivia
Anledningen till att console.log(positions) fungerar och console.log(positions[0]) inte är lätt:om du skickar en objektreferens till console.log , kommer objektet att inspekteras när du klickar på den lilla "expandera" pilen och försöker ta en titt inuti objektet/arrayen. När du klickar på den pilen har positionerna naturligtvis laddats. Men om du skickar ett specifikt arrayelement (t.ex. positions[0] ) kommer den direkt att försöka slå upp det värdet, upptäcka att det fortfarande är undefined , och registrera resultatet i konsolen.
Prova själv:
var i = [];
console.log([i]);
i.push(123);
Det föregående utdraget, i chrome 24, visar [Array[0]] i konsolen, men när jag expanderar den säger den till mig att arrayen är length: 1 och att dess första element är 123