sql >> Database >  >> NoSQL >> MongoDB

Async, Terugbellen, Sluiting, Oh My

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




  1. mongodb - haal de hoogste waarde van een som gegroepeerd op een veld

  2. Tellen op basis van conditie en delen door # records voor tijdsinterval

  3. Garandeert MongoDB-journaling duurzaamheid?

  4. MongoDB Replica Set-lidstaat is ANDERE