Pokud tomu dobře rozumím, budete chtít udělat něco takového:
var positions = this.getPositions(function(positions) {
console.log(positions[0]);
});
To znamená, že budete chtít napsat "getPositions" způsobem, který akceptuje jeden parametr zpětného volání, který se vyvolá po úspěšném načtení pozic a předá pole pozic. V getPositions
můžete zkontrolovat, zda byly pozice již načteny, a pokud ano, přímo vyvolat zpětné volání. Jinak je přidáte do fronty zpětných volání (např. this.positionsLoadedCallbacks
), přes který iterujete po načtení všech pozic (myslím, že to bude někde ve vašem load
funkce poblíž me.orderPositions()
).
Například vaše getPositions
funkce může vypadat takto:
getPositions : function(callback) {
if(this.positions !== null) {
callback(this.positions);
return;
}
this.positionsLoadedCallbacks.push(callback);
},
Někde poté, co si budete jisti, že byly pozice načteny (tj. při zpětném volání o úspěchu loadJSON), budete muset zadat něco takového:
for(var i=0; i < this.positionsLoadedCallbacks.length; i++) {
this.positionsLoadedCallbacks[i](this.positions);
}
A nezapomeňte inicializovat this.positionsLoadedCallbacks
:)
informace o konzole.log
Důvod, proč console.log(positions)
funguje a console.log(positions[0])
není je snadné:pokud předáte odkaz na objekt do console.log
, objekt bude zkontrolován, když kliknete na malou šipku "rozbalení" a pokusíte se nahlédnout dovnitř objekt/pole. Ve chvíli, kdy na tuto šipku kliknete, jsou pozice samozřejmě načteny. Pokud však předáte konkrétní prvek pole (např. positions[0]
) se přímo pokusí tuto hodnotu vyhledat a zjistí, že je stále undefined
a výsledek zaznamenejte do konzole.
Zkuste to sami:
var i = [];
console.log([i]);
i.push(123);
Předchozí úryvek v chrome 24 zobrazuje [Array[0]]
v konzole, ale když to rozbalím, řekne mi to, že pole jako length: 1
a že jeho prvním prvkem je 123