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