2014-04-30 58 views
0

我是Node.js的新手。我正在嘗試使用節點Redis plugin。我想要做的是從REDIS數據庫中獲取鍵/值對的列表。 Node的異步性質給我帶來了挑戰。當我嘗試打印鍵/值對時,我的數組是空的。我認爲它是因爲我對數據庫的查詢還沒有完成。等待在node.js中完成操作

我首先創建一個數組而不僅僅是打印出鍵/值對的原因是我想按鍵或值按字母順序對結果進行排序。目前,我的「M嘗試以下操作:

redisClient.on('connect', function() { 
    var pairs = []; 
    redisClient.keys('*', function (err, keys) { 
    if (err) { return console.log(err); } 
    for(var i = 0, len = keys.length; i < len; i++) { 
     (function(key) { 
     redisClient.get(key, function(err, v) { 
      pairs.push({ key: key, value: v }); 
     }); 
     })(keys[i]); 
    } 
    }); 

    // List of key/value pairs ordered alphabetically 
    console.log(pairs); 
}); 

有人能告訴我如何擺脫這一問題謝謝

+0

我投票接近過於寬泛。查找「節點異步代碼」,查找承諾庫等。 – djechlin

回答

2

你是對你的說法,當執行console.log,什麼也沒發生?爲了對付這種在Node.js的問題,有些人喜歡用模塊,如async和其他人喜歡使用的承諾(承諾爲流行的庫是Q)。

這裏是一個解決方案使用異步。

var async = require('async'); 

redisClient.on('connect', function() { 
    redisClient.keys('*', function (err, keys) { 
    if (err) { return console.log(err); } 

    async.map(keys, function(key, callback) { 
     redisClient.get(key, function(err, value) { 
     callback(null, {key: key, value: value}); 
     }); 
    }, function(err, pairs) { 
     console.log(pairs); 
    }); 
    }); 
}); 

異步只是碰巧有一個map函數,它接受一個數組,將函數異步地應用到每個元素並創建一個包含結果的數組。

+0

這是否仍然存在相同的問題?當對REDIS數據庫的請求正在進行時,此代碼是否通過循環競爭?因爲這個原因,在所有鍵值被檢索之前沒有被執行? – user3284007

+0

是的,你完全正確。這根本不能解決問題。給我幾分鐘,我會想出一個適當的解決方案。 –

+0

@ user3284007我已更新我的帖子,試試。 –

0

您需要使用遞歸:

do = function(i, data, callback){ 
    // if the end is reached, call the callback 
    if(data.length === i+1) 
     return callback() 
    obj = data[i] 
    redisClient.get(key, function(err, v) { 
     pairs.push({ key: key, value: v }); 
     i++; 
     // call do with the next object 
     do(i, data, callback) 
    }); 

} 
// Redis... 
do(0, keys, function(){ 
    // List of key/value pairs ordered alphabetically 
    console.log(pairs); 
});