Als ik het goed begrijp, wil je zoiets als dit doen:
var positions = this.getPositions(function(positions) {
console.log(positions[0]);
});
Dat wil zeggen, u wilt "getPositions" zo schrijven dat het een enkele callback-parameter accepteert die wordt aangeroepen zodra de posities met succes zijn geladen, en de posities-array wordt doorgegeven. In getPositions
je zou kunnen controleren of de posities al zijn geladen, en zo ja, direct de callback inroepen. Anders voegt u ze toe aan een wachtrij met callbacks (bijv. this.positionsLoadedCallbacks
), waarmee u itereert nadat alle posities zijn geladen (ik denk dat dat ergens in uw load
zou zijn functie in de buurt van me.orderPositions()
).
Bijvoorbeeld uw getPositions
functie kan er als volgt uitzien:
getPositions : function(callback) {
if(this.positions !== null) {
callback(this.positions);
return;
}
this.positionsLoadedCallbacks.push(callback);
},
Ergens nadat u zeker weet dat de posities zijn geladen (d.w.z. in de loadJSON success callback), moet u zoiets als dit plaatsen:
for(var i=0; i < this.positionsLoadedCallbacks.length; i++) {
this.positionsLoadedCallbacks[i](this.positions);
}
En vergeet niet this.positionsLoadedCallbacks
te initialiseren :)
console.log trivia
De reden dat console.log(positions)
werkt en console.log(positions[0])
niet eenvoudig:als u een objectverwijzing doorgeeft aan console.log
, zal het object worden geïnspecteerd wanneer u op de kleine "uitbreiden" pijl klikt en een kijkje probeert te nemen binnen het object/de array. Tegen de tijd dat u op die pijl klikt, zijn de posities natuurlijk geladen. Als u echter een specifiek array-element doorgeeft (bijv. positions[0]
) het zal direct proberen die waarde op te zoeken, en ontdekken dat het nog steeds undefined
is en noteer dat resultaat in de console.
Probeer het zelf:
var i = [];
console.log([i]);
i.push(123);
Het vorige fragment, in Chrome 24, toont [Array[0]]
in de console, maar wanneer ik het uitbreid, vertelt het me dat de array als length: 1
en dat het eerste element 123
. is