2015-07-10 52 views
1

我使用Redis的NPM库Node.js的 - 我可以监听连接“准备”的事件,像这样Redis的客户端 - 在(“准备好”)事件

var client = require('redis).createClient(); 

client.on('ready', function() { 

    client.keys('*', function (err, keys) { 

     if (err) { 
      log.error(err); 
     } else { 
      for (var i = 0; i < keys.length; i++) { 
       createLocalDataMap(keys[i]); 
      } 
     } 

    }); 
}); 
然而

,我该怎么查询Redis看看它是否准备好,而不是在我准备好处理它之前听一个可能会发生的事件?

我想我可以放弃就绪事件,只是做一个查询,然后等待回应,但有没有更好,更安全和更复杂的方式?

换句话说,十有八九我会写这样的功能:

var isReady = false; 

client.on('ready', function(){ 

     isReady = true; 
}); 

function doSomethingMuchLater(){ 

if(isReady){ 

    //query redis as normal 
} 
else { 

    client.on('ready', function(){ 
    isReady = true; 
    //now I do what I wanted to do 
    }); 

} 
} 

这似乎并不权可言,必须有一个更好的办法

+0

如果它真的是doSomethingMuchLater,你不必担心就绪。它将被连接。 – bluesman

+0

是的,但(a)我讨厌激情的竞争条件(b)如果连接失败---->因此我应该检查状态 –

+0

如果失败,请执行一些操作('错误')。节拍检查准备好每一个连接 – bluesman

回答

2

该节点的Redis客户端会在连接准备就绪之前自动将您发送的任何命令排队。一旦连接,这些命令都会在.on('ready')之前发送。因此,你真的不需要使用.on('ready')。如果您发送的命令太早,它们仍会按预期发送,如果连接完全失败,则永远不会发送命令。

+0

如果enable_offline_queue为false,则不是这样(默认为true)。有很多情况下这个选项可以被禁用,在这种情况下你的回答是不正确的。那时你会怎么做? –