MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Asincrono, richiamate, chiusura, oh mio

Se ho capito bene, vorrai fare qualcosa del genere:

var positions = this.getPositions(function(positions) {
    console.log(positions[0]);
});

Cioè, ti consigliamo di scrivere "getPositions" in modo che accetti un singolo parametro di callback che viene invocato una volta che le posizioni sono state caricate correttamente e viene passato l'array delle posizioni. In getPositions potresti verificare se le posizioni sono già state caricate e, in tal caso, invocare direttamente la richiamata. In caso contrario, li aggiungerai a una coda di richiamate (ad es. this.positionsLoadedCallbacks ), attraverso il quale ripeti dopo che tutte le posizioni sono state caricate (penso che sarebbe da qualche parte nel tuo load funzione vicino a me.orderPositions() ).

Ad esempio, il tuo getPositions la funzione potrebbe assomigliare a questa:

getPositions : function(callback) {
    if(this.positions !== null) {
        callback(this.positions);
        return;
    } 

    this.positionsLoadedCallbacks.push(callback);
},

Da qualche parte dopo che sei sicuro che le posizioni siano state caricate (cioè nella callback di successo loadJSON) dovrai inserire qualcosa del genere:

for(var i=0; i < this.positionsLoadedCallbacks.length; i++) {
    this.positionsLoadedCallbacks[i](this.positions);
}

E non dimenticare di inizializzare this.positionsLoadedCallbacks :)

Curiosità su console.log

Il motivo per cui console.log(positions) funziona e console.log(positions[0]) non è facile:se passi un riferimento a un oggetto a console.log , l'oggetto verrà ispezionato quando si fa clic sulla piccola freccia "espandi" e si tenta di dare un'occhiata all'interno l'oggetto/matrice. Quando fai clic su quella freccia, le posizioni sono state ovviamente caricate. Tuttavia, se passi uno specifico elemento dell'array (ad es. positions[0] ) proverà direttamente a cercare quel valore, scoprirà che è ancora undefined e registra quel risultato nella console.

Provalo tu stesso:

var i = [];
console.log([i]);
i.push(123);

Lo snippet precedente, in Chrome 24, mostra [Array[0]] nella console, ma quando lo espando, mi dice che l'array è length: 1 e che il suo primo elemento è 123