这个设计问题让我质疑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代码?
希望这是有道理的。返回对象(客户端)以及传递和触发回调是否有意义?