Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Das beste Muster für den Umgang mit asynchronen Schleifen in Node.js

Der obige Code tut möglicherweise nicht das, was Sie erwarten. Sie starten jedes .get() nacheinander, aber sie rufen möglicherweise nicht nacheinander zurück, sodass die Ergebnisse in beliebiger Reihenfolge ausgestrahlt werden können. Wenn Sie die Ergebnisse streamen möchten, anstatt sie im Speicher zu sammeln, müssen Sie .get() ausführen der Reihe nach.

Ich denke, dass die Async-Bibliothek von caolan vieles einfacher macht. Hier ist eine Möglichkeit, wie Sie damit jedes Element der Reihe nach abrufen können (Warnung, ungetestet):

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

Wenn Ihnen die Reihenfolge egal ist, verwenden Sie einfach async.forEach() stattdessen.

Wenn es Ihnen nichts ausmacht, die Ergebnisse zu sammeln und möchten, dass sie nacheinander zurückgegeben werden, können Sie async.map() verwenden so (Achtung, ebenfalls ungetestet):

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