Javascript 异步函数不工作
我正在使用node(node_redis module)使用redis,试图包装我的检索代码以进行调试和干燥,并且很难理解为什么下面的函数不起作用 我不太熟悉javascript的基本异步,所以我认为这与坏js无关 这很好,但是有一个包装器是毫无意义的:Javascript 异步函数不工作,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我正在使用node(node_redis module)使用redis,试图包装我的检索代码以进行调试和干燥,并且很难理解为什么下面的函数不起作用 我不太熟悉javascript的基本异步,所以我认为这与坏js无关 这很好,但是有一个包装器是毫无意义的: // wrapper function asyncLoad(className, id, callback) { redisClient.hget(className, id, callback); } // execution async
// 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-我知道这真的是蹩脚的错误处理;我不希望总是使用它,只是为了选择一些东西,特别是在调试期间
在这里,您希望redisClient
向您传递回调
——但是它没有,它只传递两个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`
作为参考,这里是最后一个函数;错误日志记录是自动的,如果需要,您可以对错误执行其他操作,并且您总是会返回一个解析的哈希,这很好:
// 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;
}
在第一个代码段中,您忘记了
obj
之前的var
,在第二个代码段中,您拼错了Parse
(应小写)正确且已修复--在翻译为代码段时发生。谢谢:)很漂亮,很有道理,非常感谢你的帮助!
...
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;
}