2014-04-30 60 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); 
});