我正在使用redis使用node(node_redis模块)并尝试将我的检索代码包装起来进行调试和DRY,并且无法理解为什么以下函数不起作用。
我对javascript的基本异步更新,所以我认为这与坏js以外的任何事都没有关系。
这样可以正常工作,但有一个包装器是没有意义的:
// wrapper
function asyncLoad(className, id, callback) {
redisClient.hget(className, id, callback);
}
// execution
asyncLoad('Person',1234,function(err,res) {
if (err) {
console.log(err);
} else {
var obj = JSON.parse(res);
console.log(obj);
}
});
我认为如果我能做到这一点对调试和重复有用,但我肯定做错了......
// wrapper
function asyncLoad2(className, id, callback) {
redisClient.hget(className, id, function(err,res,callback) {
console.log(callback);
if (err) {
console.log(err);
} else {
var obj = JSON.parse(res);
callback(obj);
}
});
}
// execution
asyncLoad2('Person',1234,function(obj) {
//simpler way to get back a parsed object with error handling already done
}
提前致谢! PS - 我知道这是非常蹩脚的错误处理;我不希望一直使用它,仅用于选择的东西,特别是在调试期间。
答案 0 :(得分:2)
function asyncLoad2(className, id, callback) { redisClient.hget(className, id, function(err,res,callback) {
在这里,您希望redisClient
通过callback
- 但它没有,它只会传递两个err
和res
参数。 callback
参数会隐藏callback
函数中的asyncLoad2
变量,您将无法访问它。删除参数:
function asyncLoad2(className, id, callback) {
redisClient.hget(className, id, function(err,res) {
// now refer to the actual `callback` that was passed into `asyncLoad2`
答案 1 :(得分:0)
供参考,这是最后的功能;错误记录是自动的,你可以根据需要对错误做其他事情,并且你总是得到一个解析的哈希,这很好DRY:
// wrapper
function asyncLoad(className, id, callback) {
redisClient.hget(className, id, function(e,r) {
if (e || !r) {
console.log('Error retrieving from database: ');
console.log(e);
callback(e,r);
} else {
var parsed = JSON.parse(r);
callback(e,parsed);
}
});
}
// use
asyncLoad('Person',1234, function(e,r) {
if (e) {
// do something besides just log
} else {
// the rest of your stuff here
}
});
我甚至认为我可以对整个对象进行元程序重建(因为jsonified字符串缺少原型或函数),虽然这种技术依赖于我编写(并经过全面测试!)我的构造函数的方式,应该非常小心地使用:
...
var parsed = JSON.parse(r);
var obj = reconstructObj(className, parsed);
callback(e,obj);
...
function reconstructObj(className,hash) {
//instantiate a new object of the correct class
var obj = eval('new ' + className + '()');
//overwrite the properties from the hash values
for (prop in hash) {
obj[prop] = hash[prop];
}
return obj;
}