MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Async, Rappels, Fermeture, Oh My

Si je comprends bien, vous voudrez faire quelque chose comme ceci :

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

C'est-à-dire que vous voudrez écrire "getPositions" de manière à ce qu'il accepte un seul paramètre de rappel qui est invoqué une fois que les positions ont été chargées avec succès et que le tableau de positions est transmis. Dans getPositions vous pouvez vérifier si les positions ont déjà été chargées et, si c'est le cas, invoquer directement le rappel. Sinon, vous les ajouterez à une file d'attente de rappels (par exemple, this.positionsLoadedCallbacks ), à travers lequel vous itérez après que toutes les positions ont été chargées (je pense que ce serait quelque part dans votre load fonction près de me.orderPositions() ).

Par exemple, votre getPositions la fonction pourrait ressembler à ceci :

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

    this.positionsLoadedCallbacks.push(callback);
},

Quelque part après être sûr que les positions ont été chargées (c'est-à-dire dans le rappel de succès loadJSON), vous devrez mettre quelque chose comme ceci :

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

Et n'oubliez pas d'initialiser this.positionsLoadedCallbacks :)

anecdotes sur console.log

La raison pour laquelle console.log(positions) fonctionne et console.log(positions[0]) n'est pas facile :si vous passez une référence d'objet à console.log , l'objet sera inspecté lorsque vous cliquerez sur la petite flèche "développer" et essayerez de jeter un coup d'œil à l'intérieur l'objet/tableau. Au moment où vous cliquez sur cette flèche, les positions ont bien sûr été chargées. Cependant, si vous passez un élément de tableau spécifique (par exemple, positions[0] ) il essaiera directement de rechercher cette valeur, trouvera qu'elle est toujours undefined , et enregistrez le résultat dans la console.

Essayez vous-même :

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

L'extrait précédent, en chrome 24, montre [Array[0]] dans la console, mais quand je le développe, il me dit que le tableau sous la forme length: 1 et que son premier élément est 123