Javascript Module.exports异步单例设计

Javascript Module.exports异步单例设计,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,这个设计问题让我质疑Node.js从根本上是如何工作的。我正在创建一个返回Redis客户端实例的基本模块。这是一种单例模式,其中只有一个Redis客户端实例全局存在 我的一个问题是——Redis是否有异步方法,或者大多数Redis方法是同步的?例如,client.select和client.subscribe是同步的还是异步的?例如: var client = null; exports.getRedisSubscription = function(port,host,database,ca

这个设计问题让我质疑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代码


希望这是有意义的。返回对象客户机以及传递并启动回调有意义吗?

如果函数不将回调作为参数或返回承诺,那么它有99%的几率是同步的,因为在异步进程完成时,它无法发出信号。如果需要回调,那么查看文档或代码,看看回调是如何描述的,这可能会给你答案;但是,关于上面的另一个问题,我主要关心的是,这个函数是否会快速返回客户机变量,或者JS事件循环是否会在返回客户机对象之前处理一些async.series代码?如果您的代码是由文档编写的,我会假设您可以立即使用客户机,因为它看起来是同步的。但是,我不确定的是,在连接事件发生之前是否可以使用它。在异步操作中使用async.series时,它将启动第一个异步操作,然后继续执行,并在异步库启动其他操作之前返回客户端对象。这些后续操作只有在之前的操作完成后才会启动,这就是async.series所做的。不过,我认为您可能对如何最好地使用redis有误解。我真的不太了解redis,无法为您编写代码,但您不需要使用async.series来设置消息处理程序来执行.subscribe。