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

Asynkron, tilbagekald, lukning, Oh My

Hvis jeg forstår det rigtigt, vil du gerne gøre noget som dette:

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

Det vil sige, at du vil skrive "getPositions" på en måde, så den accepterer en enkelt tilbagekaldsparameter, som påkaldes, når positionerne er indlæst med succes, og passerer positionsarrayet. I getPositions du kan tjekke, om stillingerne allerede er indlæst, og hvis det er tilfældet, direkte påkalde tilbagekaldet. Ellers vil du tilføje dem til en kø af tilbagekald (f.eks. this.positionsLoadedCallbacks ), hvorigennem du itererer, efter at alle positioner er blevet indlæst (jeg tror, ​​det ville være et sted i din load funktion nær me.orderPositions() ).

For eksempel din getPositions funktion kan se sådan ud:

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

    this.positionsLoadedCallbacks.push(callback);
},

Et sted, efter at du er sikker på, at positionerne er blevet indlæst (dvs. i loadJSON-succes-tilbagekaldet), skal du sætte noget som dette:

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

Og glem ikke at initialisere this.positionsLoadedCallbacks :)

console.log trivia

Årsagen til, at console.log(positions) fungerer og console.log(positions[0]) ikke er let:hvis du sender en objektreference til console.log , vil objektet blive inspiceret, når du klikker på den lille "udvid" pil og prøver at tage et kig indeni objektet/arrayet. Når du klikker på den pil, er positionerne selvfølgelig blevet indlæst. Men hvis du passerer et specifikt array-element (f.eks. positions[0] ) vil den direkte forsøge at slå den værdi op, finde ud af, at den stadig er undefined , og optag resultatet i konsollen.

Prøv det selv:

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

Det forrige uddrag, i chrome 24, viser [Array[0]] i konsollen, men når jeg udvider den, fortæller den mig, at arrayet er length: 1 og at dets første element er 123




  1. Hvordan laver man ikke-CRUD og ikke-grundlæggende MongoDB-kommandoer i ObjCMongoDB?

  2. installation af MongoDB java-driver

  3. Hvordan indstiller jeg adgangskoden til Redis?

  4. Opret en databaseklynge i skyen med MongoDB Atlas