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

Le meilleur modèle pour gérer les boucles asynchrones dans Node.js

Le code ci-dessus peut ne pas faire ce que vous attendez. Vous lancez chaque .get() dans l'ordre, mais il se peut qu'ils ne rappellent pas dans l'ordre : les résultats peuvent donc être diffusés dans n'importe quel ordre. Si vous souhaitez diffuser les résultats au lieu de les collecter en mémoire, vous devez .get() dans l'ordre.

Je pense que la bibliothèque asynchrone de caolan facilite beaucoup cela. Voici une façon de l'utiliser pour obtenir chaque élément dans l'ordre (avertissement, non testé) :

app.get("/facility", function(req, res) {
    rc.keys("FACILITY*", function(err, replies) {
        var i = 0;
        res.write("[");
        async.forEachSeries(replies, function(reply, callback){
            rc.get(reply, function(err, reply) {
                if (err){
                    callback(err);
                    return;
                }
                res.write(reply);
                if (i < replies.length) {
                    res.write(",");
                }
                i++;
                callback();
            });
        }, function(err){
            if (err) {
                // Handle an error
            } else {
                res.end(']');
            }
        });
    });
});

Si vous ne vous souciez pas de la commande, utilisez simplement async.forEach() à la place.

Si cela ne vous dérange pas de collecter les résultats et que vous souhaitez qu'ils reviennent dans l'ordre, vous pouvez utiliser async.map() comme ceci (avertissement, également non testé):

app.get("/facility", function(req, res) {
    rc.keys("FACILITY*", function(err, replies) {
        async.map(replies, rc.get.bind(rc), function(err, replies){
            if (err) {
                // Handle an error
            } else {
                res.end('[' + replies.join(',') + ']');
            }
        });
    });
});