sql >> Databáze >  >> NoSQL >> MongoDB

Async, Callbacks, Close, Oh My

Pokud tomu dobře rozumím, budete chtít udělat něco takového:

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

To znamená, že budete chtít napsat "getPositions" způsobem, který akceptuje jeden parametr zpětného volání, který se vyvolá po úspěšném načtení pozic a předá pole pozic. V getPositions můžete zkontrolovat, zda byly pozice již načteny, a pokud ano, přímo vyvolat zpětné volání. Jinak je přidáte do fronty zpětných volání (např. this.positionsLoadedCallbacks ), přes který iterujete po načtení všech pozic (myslím, že to bude někde ve vašem load funkce poblíž me.orderPositions() ).

Například vaše getPositions funkce může vypadat takto:

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

    this.positionsLoadedCallbacks.push(callback);
},

Někde poté, co si budete jisti, že byly pozice načteny (tj. při zpětném volání o úspěchu loadJSON), budete muset zadat něco takového:

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

A nezapomeňte inicializovat this.positionsLoadedCallbacks :)

informace o konzole.log

Důvod, proč console.log(positions) funguje a console.log(positions[0]) není je snadné:pokud předáte odkaz na objekt do console.log , objekt bude zkontrolován, když kliknete na malou šipku "rozbalení" a pokusíte se nahlédnout dovnitř objekt/pole. Ve chvíli, kdy na tuto šipku kliknete, jsou pozice samozřejmě načteny. Pokud však předáte konkrétní prvek pole (např. positions[0] ) se přímo pokusí tuto hodnotu vyhledat a zjistí, že je stále undefined a výsledek zaznamenejte do konzole.

Zkuste to sami:

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

Předchozí úryvek v chrome 24 zobrazuje [Array[0]] v konzole, ale když to rozbalím, řekne mi to, že pole jako length: 1 a že jeho prvním prvkem je 123




  1. Jak ověřím členy pole pole?

  2. Nelze vytvořit index kvůli TypeError:nedostatek argumentů pro formátovací řetězec

  3. Proč koncový bajt 0x00 za řetězcem BSON (nikoli Cstring/ename)?

  4. Jak vybrat mongo subdokument podle id s mongoose?