MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Assíncrono, Callbacks, Fechamento, Oh meu Deus


Se eu entendi corretamente, você vai querer fazer algo assim:
var positions = this.getPositions(function(positions) {
    console.log(positions[0]);
});

Ou seja, você desejará escrever "getPositions" de forma que ele aceite um único parâmetro de retorno de chamada que seja invocado assim que as posições forem carregadas com sucesso e for passado para o array de posições. Em getPositions você pode verificar se as posições já foram carregadas e, em caso afirmativo, invocar diretamente o retorno de chamada. Caso contrário, você os adicionará a uma fila de retornos de chamada (por exemplo, this.positionsLoadedCallbacks ), através do qual você itera após todas as posições terem sido carregadas (acho que isso estaria em algum lugar em seu load função perto de me.orderPositions() ).

Por exemplo, seu getPositions função pode ficar assim:
getPositions : function(callback) {
    if(this.positions !== null) {
        callback(this.positions);
        return;
    } 

    this.positionsLoadedCallbacks.push(callback);
},

Em algum lugar depois de ter certeza de que as posições foram carregadas (ou seja, no retorno de chamada loadJSON de sucesso), você precisará colocar algo assim:
for(var i=0; i < this.positionsLoadedCallbacks.length; i++) {
    this.positionsLoadedCallbacks[i](this.positions);
}

E não se esqueça de inicializar this.positionsLoadedCallbacks :)

trivia do console.log


O motivo pelo qual console.log(positions) funciona e console.log(positions[0]) não é fácil:se você passar uma referência de objeto para console.log , o objeto será inspecionado quando você clicar na pequena seta "expandir" e tentar dar uma olhada dentro o objeto/matriz. No momento em que você clicar nessa seta, as posições foram carregadas, é claro. No entanto, se você passar um elemento de array específico (por exemplo, positions[0] ) ele tentará diretamente procurar esse valor, descobrir que ainda está undefined e registre esse resultado no console.

Tente você mesmo:
var i = [];
console.log([i]);
i.push(123);

O snippet anterior, no chrome 24, mostra [Array[0]] no console, mas quando eu o expando, ele me diz que o array como length: 1 e que seu primeiro elemento é 123