我是Node.js的新手。我正在尝试使用节点Redis plugin。我要做的是从REDIS数据库中获取键/值对列表。 Node的异步性质给我带来了挑战。当我尝试打印键/值对时,我的数组是空的。我认为这是因为我对数据库的查询还没有完成。
我首先创建数组而不是仅打印键/值对的原因是因为我想按键或值按字母顺序对结果进行排序。目前,我正在尝试以下方法:
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 :(得分:2)
你的断言是正确的,当执行console.log
时,什么也没发生。为了解决Node.js中的这类问题,有些人喜欢使用像async这样的模块,而其他人更喜欢使用promises(一个受欢迎的promises库是Q)。
以下是使用async的解决方案。
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
函数接受一个数组,异步应用一个函数到每个元素并创建一个包含结果的数组。
答案 1 :(得分: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);
});