sql >> Databasteknik >  >> NoSQL >> MongoDB

Async, Callbacks, Closure, Oh My

Om jag förstår det rätt, kommer du att vilja göra något så här:

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

Det vill säga, du kommer att vilja skriva "getPositions" på ett sätt så att den accepterar en enda callback-parameter som anropas när positionerna har laddats framgångsrikt och passerat positionsarrayen. I getPositions du kan kontrollera om positionerna redan har laddats, och i så fall direkt anropa återuppringningen. Annars lägger du till dem i en kö av återuppringningar (t.ex. this.positionsLoadedCallbacks ), genom vilken du itererar efter att alla positioner har laddats (jag tror att det skulle vara någonstans i din load funktion nära me.orderPositions() ).

Till exempel din getPositions funktionen kan se ut så här:

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

    this.positionsLoadedCallbacks.push(callback);
},

Någonstans efter att du är säker på att positionerna har laddats (dvs. i loadJSON success callback) måste du sätta något så här:

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

Och glöm inte att initiera this.positionsLoadedCallbacks :)

console.log-trivia

Anledningen till att console.log(positions) fungerar och console.log(positions[0]) inte är lätt:om du skickar en objektreferens till console.log , kommer objektet att inspekteras när du klickar på den lilla "expandera" pilen och försöker ta en titt inuti objektet/arrayen. När du klickar på den pilen har positionerna naturligtvis laddats. Men om du skickar ett specifikt arrayelement (t.ex. positions[0] ) kommer den direkt att försöka slå upp det värdet, upptäcka att det fortfarande är undefined , och registrera resultatet i konsolen.

Prova själv:

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

Det föregående utdraget, i chrome 24, visar [Array[0]] i konsolen, men när jag expanderar den säger den till mig att arrayen är length: 1 och att dess första element är 123




  1. hur man konfigurerar timeout för JedisConnectionFactory-basen på fjäderstövelramverket

  2. Hur ansluter jag Django Rest-api med MongoDB?

  3. mongodb:hur kan jag se exekveringstiden för det samlade kommandot?

  4. Hur hanterar MongoDB samtidiga uppdateringar?