sql >> Base de Datos >  >> NoSQL >> MongoDB

Asíncrono, devoluciones de llamada, cierre, Dios mío

Si lo entiendo correctamente, querrás hacer algo como esto:

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

Es decir, querrá escribir "getPositions" de manera que acepte un solo parámetro de devolución de llamada que se invoca una vez que las posiciones se han cargado correctamente y se pasa la matriz de posiciones. En getPositions puede verificar si las posiciones ya se han cargado y, de ser así, invocar directamente la devolución de llamada. De lo contrario, los agregará a una cola de devoluciones de llamada (por ejemplo, this.positionsLoadedCallbacks ), a través del cual itera después de que se hayan cargado todas las posiciones (creo que estaría en algún lugar de su load función cerca de me.orderPositions() ).

Por ejemplo, su getPositions la función podría verse así:

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

    this.positionsLoadedCallbacks.push(callback);
},

En algún lugar después de estar seguro de que las posiciones se han cargado (es decir, en la devolución de llamada exitosa de loadJSON), deberá poner algo como esto:

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

Y no olvides inicializar this.positionsLoadedCallbacks :)

consola.registro de curiosidades

La razón por la que console.log(positions) funciona y console.log(positions[0]) no es fácil:si pasa una referencia de objeto a console.log , el objeto se inspeccionará cuando haga clic en la pequeña flecha "expandir" e intente echar un vistazo dentro el objeto/matriz. En el momento en que haga clic en esa flecha, las posiciones se habrán cargado, por supuesto. Sin embargo, si pasa un elemento de matriz específico (por ejemplo, positions[0] ) intentará directamente buscar ese valor, encontrará que todavía está undefined y registre ese resultado en la consola.

Pruébelo usted mismo:

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

El fragmento anterior, en Chrome 24, muestra [Array[0]] en la consola, pero cuando lo expando, me dice que la matriz tiene una longitud de length: 1 y que su primer elemento es 123