Comment émuler "sleep" dans NodeJS?

Je suis la construction d'un jeu par navigateur avec une mini-carte de l'entourage du joueur. J'ai besoin de piste, là où d'autres joueurs et de mettre à jour cette mini carte à chaque fois que quelqu'un se déplace. Je suis la mise en œuvre de cette NodeJS et CouchDB. Ma conception de la va comme suit:

J'ai une base de données pour toute modification des données de jeu. Dans cette base de données, j'ai un document qui contient le plan de base de données dans un tableau à deux dimensions, avec chaque carré de la grille étant représenté par un élément de ce tableau. Depuis que j'ai pu avoir des tonnes de différents utilisateurs qui se déplacent sur la carte simultanément, j'ai besoin d'un moyen pour s'assurer que je n'ai pas lu que quelqu'un d'autre est écrit (j'ai pu obtenir des informations erronées si une tonne d'utilisateurs sont la lecture et l'écriture d'un document unique). J'ai décidé de séparer les documents dans cette base de données qui représentent les carrés individuels, et chaque document a des joueurs qui sont "sur" cette place et certaines autres données associées à cette place. Essentiellement, la carte est utilisée comme une table de recherche pour le carré document. Cela me permet de changer un seul document sans avoir à réécrire l'ensemble de la carte du document, la résolution du problème de la traduction simultanée des lectures et écritures.

Mon problème, cependant, c'est que j'ai besoin d'obtenir une mini-carte pour l'utilisateur à utiliser comme référence. Cette mini carte sera dans les documents de l'entourage places. Depuis que j'ai besoin de tout cela en même temps, j'ai pensé que je viens de prendre toutes les 9 carrés de la base de données et de retourner dans une seule réponse ajax. Mon problème est de réduire la quantité de blocage IO que je fais. Maintenant, j'ai une boucle imbriquée qui demande à l'carrés j'ai besoin de la base de données. Voici un coup d'oeil à mon code (la position et la carte sont passés):

var miniMap = new Array();
var keyMap = new Object();
var numDone = 0;
for(i = position.y - 1, y = 0; i < position.y + 1 && i < map.length; i++, y++){
    miniMap[i] = new Array();
    for(v = position.x - 1, x = 0; v < position.x + 1 && v < map.length; v++, x++){
        keyMap[map[i][v].id] = {'x': x, 'y': y};
        gameDB.getDoc(map[i][v].id, function(er, doc){
            var tPos = keyMap[doc._id];
            miniMap[tPos.y][tPos.x] = doc;
            numDone++;
        });
    }
}

Mon problème, cependant, est que getDoc est non-bloquant, donc je ne sais pas quand il sera de définir la place des données à la mini-carte. J'ai pensé à faire quelque chose comme ceci:

while(numDone < 9){
    sleep(10);
}
callback(miniMap);

Cela me permettra de patienter jusqu'à ce que CouchDB est fini toutes mes données, mais le JavaScript ne dispose pas d'une fonction de veille. Le plus proche que j'ai trouvé était setTimeout, mais qui est aussi non-bloquant et je ne vais jamais être sûr à 100% que le temps que j'ai choisi pour le délai sera suffisant pour permettre à CouchDB pour finir mes données.

Donc, fondamentalement, je veux avoir une condition, l'essai, puis retour à la pile d'événements de nouveau si la condition est fausse. La seule solution que j'ai pensé était d'avoir un appel récursif à setTimeout rappel qui ferait quelque chose comme ceci:

function testCallback(data, condition, callback){
    if(data < condition){
        setTimeout(function(){
            testCallback(data, condition, callback);
        }, 10);
    }else{
        callback(data);
    }
}

Cela semble assez terrible... Est-il une meilleure façon que j'ai pu faire cela? Dois-je renoncer à cette approche et de la force il y a de multiples appels ajax pour obtenir des données à jour? Dois-je aller pour un blocage de l'approche?

source d'informationauteur tjameson