MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Asynchron, Rückrufe, Schließung, oh mein Gott

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