可能这是一个简单而愚蠢的问题,但我只是学习了我的第一个异步服务器语言而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项目我得到了疯狂的嵌套函数 - 回调。
如何解决这个问题并制作漂亮可读的代码?
答案 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);