Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

O melhor padrão para lidar com loops assíncronos no Node.js


O código acima pode não fazer o que você espera. Você está iniciando cada .get() em sequência, mas eles podem não ligar de volta em sequência, para que os resultados possam ser transmitidos em qualquer ordem. Se você deseja transmitir os resultados em vez de coletá-los na memória, você precisa .get() em sequência.

Acho que a biblioteca assíncrona do caolan facilita muito isso. Aqui está uma maneira de usá-lo para obter cada item em sequência (aviso, não testado):
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(']');
            }
        });
    });
});

Se você não se importa com o pedido, basta usar async.forEach() em vez de.

Se você não se importar em coletar os resultados e quiser que eles retornem em sequência, você pode usar async.map() assim (aviso, também não testado):
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(',') + ']');
            }
        });
    });
});