Wenn ich es richtig verstehe, werden Sie so etwas tun wollen:
var positions = this.getPositions(function(positions) {
console.log(positions[0]);
});
Das heißt, Sie sollten "getPositions" so schreiben, dass es einen einzelnen Callback-Parameter akzeptiert, der aufgerufen wird, sobald die Positionen erfolgreich geladen wurden, und an das Positions-Array übergeben wird. In getPositions
Sie könnten überprüfen, ob die Positionen bereits geladen wurden, und wenn ja, direkt den Callback aufrufen. Andernfalls fügen Sie sie einer Warteschlange von Rückrufen hinzu (z. B. this.positionsLoadedCallbacks
), durch die Sie iterieren, nachdem alle Positionen geladen wurden (ich denke, das wäre irgendwo in Ihrem load
Funktion in der Nähe von me.orderPositions()
).
Zum Beispiel Ihre getPositions
Funktion könnte so aussehen:
getPositions : function(callback) {
if(this.positions !== null) {
callback(this.positions);
return;
}
this.positionsLoadedCallbacks.push(callback);
},
Irgendwann, nachdem Sie sicher sind, dass die Positionen geladen wurden (d. h. im loadJSON-Erfolgs-Callback), müssen Sie so etwas einfügen:
for(var i=0; i < this.positionsLoadedCallbacks.length; i++) {
this.positionsLoadedCallbacks[i](this.positions);
}
Und vergessen Sie nicht, this.positionsLoadedCallbacks
zu initialisieren :)
console.log-Trivia
Der Grund dafür, dass console.log(positions)
funktioniert und console.log(positions[0])
Das ist nicht einfach:wenn Sie eine Objektreferenz an console.log
übergeben , wird das Objekt inspiziert, wenn Sie auf den kleinen "Erweitern"-Pfeil klicken und versuchen, einen Blick hinein zu werfen das Objekt/Array. Wenn Sie auf diesen Pfeil klicken, sind die Positionen natürlich geladen. Übergeben Sie jedoch ein bestimmtes Array-Element (z. B. positions[0]
) wird es direkt versuchen, diesen Wert nachzuschlagen, und feststellen, dass er immer noch undefined
ist , und zeichnen Sie das Ergebnis in der Konsole auf.
Probieren Sie es selbst aus:
var i = [];
console.log([i]);
i.push(123);
Das vorherige Snippet in Chrome 24 zeigt [Array[0]]
in der Konsole, aber wenn ich es erweitere, sagt es mir, dass das Array als length: 1
und dass sein erstes Element 123
ist