Module.exports异步单例设计

时间:2015-04-23 22:05:16

标签: javascript node.js asynchronous

这个设计问题让我质疑Node.js如何从根本上运作。我正在创建一个返回Redis客户端实例的基本模块。它是一种单例模式,只有一个Redis客户端实例应该全局存在。

我的一个问题是 - Redis是否存在任何异步方法,或者大多数Redis方法是否同步?例如,client.select()和client.subscribe() - 是同步还是异步?例如:

var client = null;

exports.getRedisSubscription = function(port,host,database,callback){

    if(client != null){
        return client;
    }

    var async = require('async');
    var redis = require('redis');
    var client = redis.createClient(port,host);

    const REDIS_PUB_MESSAGE = 'redis_pub_message';

    client.on('connect', function() {
        console.log('connected');
    });

    client.on("error", function (err) {
        console.log("Error " + err);
    });

    async.series([
        function(cb){
            client.select(database, function() { //async or sync?
                cb();
            });
        },
        function(cb){
            client.on('message', function(channel, key) {
                switch (channel) {
                    case REDIS_PUB_MESSAGE:
                        console.log('channel:',channel,'key:',key);
                        break;
                    default:
                        console.log('DEFAULT channel:',channel,'key:',key);
                }
            });
            cb();
        }, function(cb){
                client.subscribe(REDIS_PUB_MESSAGE); //async or sync?
                cb();
            }],
        callback
    );

    return client; //return client object right away, even though some properties might not be registered yet...
};

我担心的是client.select与client.subscribe是异步的;这使我能够使用此函数进行回调,而不是仅在没有回调的情况下返回客户端对象。在这种情况下,我返回客户端,但是我使用异步库来调用client.select和client.subscribe,并且只有在完成后才会触发顶级回调。

但是,我主要担心的是这个函数是否会快速返回客户端变量,或者JS事件循环是否会在返回客户端对象之前处理一些async.series代码?

希望这是有道理的。返回对象(客户端)以及传递和触发回调是否有意义?

0 个答案:

没有答案