sql >> データベース >  >> NoSQL >> Redis

Node.jsで非同期ループを処理するための最良のパターン

    上記のコードは、期待どおりに機能しない可能性があります。各.get()を開始します 順番にコールバックしない可能性があります。そのため、結果は任意の順序でストリーミングされる可能性があります。結果をメモリに収集する代わりにストリーミングする場合は、.get()を実行する必要があります。 順番に。

    caolanの非同期ライブラリを使用すると、これがはるかに簡単になると思います。これを使用して各アイテムを順番に取得する方法の1つを次に示します(警告、未テスト):

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

    順序を気にしない場合は、async.forEach()を使用してください。 代わりに。

    結果を収集して順番に返すことを気にしない場合は、async.map()を使用できます。 このように(警告、これもテストされていません):

    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. JSONにシリアル化してRails4.0.3に戻すときに、has_many:throughの関係を維持するにはどうすればよいですか?

    2. PyMongoを使用した正規表現クエリの実行

    3. MongoDB findOne()

    4. TornadoからRedisを*適切に*クエリするにはどうすればよいですか?