Redis
 sql >> Database >  >> NoSQL >> Redis

Il modello migliore per la gestione dei loop asincroni in Node.js

Il codice sopra potrebbe non fare ciò che ti aspetti. Stai dando il via a ogni .get() in sequenza, ma potrebbero non richiamare in sequenza, quindi i risultati potrebbero essere trasmessi in streaming in qualsiasi ordine. Se vuoi trasmettere i risultati in streaming invece di raccoglierli in memoria, devi .get() in sequenza.

Penso che la libreria asincrona di caolan renda molto più semplice tutto questo. Ecco un modo in cui puoi usarlo per ottenere ogni elemento in sequenza (avviso, non testato):

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 non ti interessa l'ordine, usa semplicemente async.forEach() invece.

Se non ti dispiace raccogliere i risultati e vuoi che tornino in sequenza, puoi usare async.map() in questo modo (attenzione, anche non testato):

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