我正在使用 Node (node_redis 模块)来使用 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 - 我知道这确实是蹩脚的错误处理;我并不期望一直使用它,只是为了选择一些东西,特别是在调试期间。
最佳答案
function asyncLoad2(className, id, callback) { redisClient.hget(className, id, function(err,res,callback) {
在这里,您期望 redisClient
向您传递 callback
- 但事实并非如此,它只会传递两个 err
和 res
参数。 callback
参数隐藏了 asyncLoad2
函数中的 callback
变量,您将无法访问它。删除参数:
function asyncLoad2(className, id, callback) {
redisClient.hget(className, id, function(err,res) {
// now refer to the actual `callback` that was passed into `asyncLoad2`
关于javascript - 异步功能不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23347798/