Jeśli dobrze rozumiem, będziesz chciał zrobić coś takiego:
var positions = this.getPositions(function(positions) {
console.log(positions[0]);
});
Oznacza to, że będziesz chciał napisać "getPositions" w taki sposób, aby akceptował pojedynczy parametr wywołania zwrotnego, który jest wywoływany po pomyślnym załadowaniu pozycji i jest przekazywany do tablicy positions. W getPositions
możesz sprawdzić, czy pozycje zostały już załadowane, a jeśli tak, bezpośrednio wywołać callback. W przeciwnym razie dodasz je do kolejki wywołań zwrotnych (np. this.positionsLoadedCallbacks
), przez które wykonujesz iterację po załadowaniu wszystkich pozycji (myślę, że byłoby to gdzieś w twoim load
funkcja w pobliżu me.orderPositions()
).
Na przykład Twoje getPositions
funkcja może wyglądać tak:
getPositions : function(callback) {
if(this.positions !== null) {
callback(this.positions);
return;
}
this.positionsLoadedCallbacks.push(callback);
},
Gdzieś po upewnieniu się, że pozycje zostały załadowane (tj. w wywołaniu zwrotnym sukcesu loadJSON), musisz umieścić coś takiego:
for(var i=0; i < this.positionsLoadedCallbacks.length; i++) {
this.positionsLoadedCallbacks[i](this.positions);
}
I nie zapomnij zainicjować this.positionsLoadedCallbacks
:)
ciekawostki dotyczące konsoli.log
Powód, dla którego console.log(positions)
działa i console.log(positions[0])
nie jest łatwe:jeśli przekażesz referencję do obiektu do console.log
, obiekt zostanie sprawdzony, gdy klikniesz małą strzałkę „rozwiń” i spróbujesz zajrzeć do środka obiekt/tablica. Oczywiście do czasu kliknięcia tej strzałki pozycje zostaną załadowane. Jeśli jednak przekażesz określony element tablicy (np. positions[0]
) spróbuje bezpośrednio wyszukać tę wartość i stwierdzi, że nadal jest undefined
i zapisz wynik w konsoli.
Wypróbuj sam:
var i = [];
console.log([i]);
i.push(123);
Poprzedni fragment, w chrome 24, pokazuje [Array[0]]
w konsoli, ale kiedy ją rozwinę, mówi mi, że tablica ma length: 1
i że jego pierwszym elementem jest 123