等待在node.js中完成操作

时间:2014-04-30 18:21:56

标签: node.js

我是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);
});

有人能告诉我如何超越这个问题吗?谢谢

2 个答案:

答案 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);
});