Javascript Module.exports异步单例设计
这个设计问题让我质疑Node.js从根本上是如何工作的。我正在创建一个返回Redis客户端实例的基本模块。这是一种单例模式,其中只有一个Redis客户端实例全局存在 我的一个问题是——Redis是否有异步方法,或者大多数Redis方法是同步的?例如,client.select和client.subscribe是同步的还是异步的?例如: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
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。