node.js redis select and smembers in aync

时间:2014-09-10 08:28:47

标签: node.js asynchronous redis

我对node.js中的异步调用感到非常痛苦。我明白我必须喜欢它,但实际上我讨厌它,只是因为node.js强迫你使用它,而且没有其他选择。

我尝试在不同的数据库上运行smembers。所以在这里我想确保我使用所有3个数据库因此我使用_.after。但是它没有用。

var redisfetcher = function(string, callback1)
{
   var retrieved = []

    var callback = function(){
        callback1(retrieved)
    }

    var afterAll = _.after(3,callback)

    for (var col=0; col<=2; ++col) {
        client.select(col, function() {
            client.smembers(string, function (err, replies) {
             if(!err){
                retrieved.push(replies)
                }
            })
        afterAll();
        })
    }

redisfetcher("offer", function(returnValue) {
    console.log(returnValue)
    })

如果你能帮助我,我将不胜感激。

如果你能展示如何在同步模式下运行以下代码,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

使用async模块。

var async = require('async');

async.mapSeries([0, 1, 2], function (db, done) {
    // Here `db` will be `0`, or `1` or `2`, i.e. each element of the array.
    // The `done` is an internal callback used by the `async` module
    // to track whether a particular element of the array is completed
    // to be processed. When you're "done" consuming the `db` element of the
    // array, you must call `done` to indicate that `async` can now give you
    // yet another element to consume, if there is any left to process.
    // When all elements are processed, `async` calls the final function
    // passes to it as the last argument. For more information refer to
    // very detailed docs of `async` module at 
    // https://github.com/caolan/async#mapSeries.
    async.waterfall([
        function (cb) {
            client.select(db, cb);
        },
        function (cb) {
            client.smembers(string, cb);
        }
    ], done);
}, function(err, resultArr) {
    err && console.trace(err);

    // `resultArr` now contains 3 replies.
});

请注意上面的代码调用mapSeries这是顺序的(不要与同步混淆),而不是map。我建议在您的情况下为每个数据库使用不同的Redis连接,因为如果并行调用,则由于选择不同的数据库而导致同步调用可能会发生冲突。这可能导致针对同一数据库运行命令而不是预期的不同。如果对同一数据库运行多个命令,则单个连接即可。

对于连接池,请使用node-pool