2015-07-10 72 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)。有很多情況下這個選項可以被禁用,在這種情況下你的回答是不正確的。那時你會怎麼做? –

相關問題