使用节点js和redis - 获取可读代码

时间:2012-02-22 17:24:14

标签: javascript node.js nosql redis key-value

可能这是一个简单而愚蠢的问题,但我只是学习了我的第一个异步服务器语言而redis是我的第一个键值db。

实施例。我需要这样做:

$x = users:count
get user:$x

但是使用asynchronic javascript我得到了这段代码

redis-cli.get('users:count', function(err, repl){
  if(err){
    errorHandler(err);
  } else {
    redis-cli.get('user:'+repl, function(err, repl){
      if(err){
        errorHandler(err);
      } else {
        console.log('We get user '+repl+'!')
      }
    })
  }
})

这段代码不是那么大而且没有嵌套太多,但它看起来像我的firt not example / test项目我得到了疯狂的嵌套函数 - 回调。

如何解决这个问题并制作漂亮可读的代码?

1 个答案:

答案 0 :(得分:2)

function getUserCount(callback, err, repl) {
  if (err) {
    return callback(err);
  }
  redis-cli.get('user:' + repl, getUser.bind(null, callback));
}

function getUser(callback, err, repl) {
  if (err) {
    return callback(err);
  }
  console.log('We get user ' + repl + '!');
}

redis-cli.get('users:count', getUserCount.bind(null, errorHandler));

bind创造奇迹。如果您希望抽象绑定,那么您可以使用this来存储通常存储在闭包中的状态,如:

require("underscore").bindAll({
  run: function (errorHandler) {
    this.errorHandler = errorHandler;
    redis-cli.get('users:count', this.getUserCount);
  },
  getUserCount: function (err, repl) {
    if (err) return this.errorHandler(err);
    redis-cli.get('user:' + repl, this.getUser);
  },
  getUser: function (err, repl) {
    if (err) return this.errorHandler(err);
    console.log('got user ', repl);
  }
}).run(errorHandler);