sql >> Base de Datos >  >> NoSQL >> Redis

El mejor patrón para manejar bucles asíncronos en Node.js

Es posible que el código anterior no haga lo que espera. Estás iniciando cada .get() en secuencia, pero es posible que no devuelvan la llamada en secuencia, por lo que los resultados podrían transmitirse en cualquier orden. Si desea transmitir los resultados en lugar de recopilarlos en la memoria, debe .get() en secuencia.

Creo que la biblioteca asíncrona de caolan hace que esto sea mucho más fácil. Aquí hay una forma en que podría usarlo para obtener cada elemento en secuencia (advertencia, no probado):

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 no le importa el orden, simplemente use async.forEach() en su lugar.

Si no le importa recopilar los resultados y quiere que regresen en secuencia, puede usar async.map() así (advertencia, también no probado):

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(',') + ']');
            }
        });
    });
});