sql >> Databáze >  >> NoSQL >> Redis

Nejlepší vzor pro zpracování asynchronního opakování v Node.js

Výše uvedený kód nemusí dělat to, co očekáváte. Spouštíte každý .get() v sekvenci, ale nemusí volat zpět v sekvenci – výsledky by se tedy mohly vysílat v libovolném pořadí. Pokud chcete výsledky streamovat místo shromažďování v paměti, musíte použít .get() v pořadí.

Myslím, že asynchronní knihovna Caolanu to hodně usnadňuje. Zde je jeden způsob, jak jej použít k získání každé položky v pořadí (varování, netestováno):

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

Pokud vám nezáleží na pořadí, použijte async.forEach() místo toho.

Pokud by vám nevadilo shromažďovat výsledky a chcete, aby se vracely postupně, můžete použít async.map() takto (varování, také netestováno):

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


  1. Zabraňte Mongoose ve vytváření vlastnosti _id pro položky pole vnořených dokumentů

  2. Jak používat Redis z Node.js

  3. Replikace operační databáze Cloudera v kostce

  4. Efektivní způsob redis aktualizace členů sady