Javascript 异步函数不工作

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

我正在使用node(node_redis module)使用redis,试图包装我的检索代码以进行调试和干燥,并且很难理解为什么下面的函数不起作用

我不太熟悉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-我知道这真的是蹩脚的错误处理;我不希望总是使用它,只是为了选择一些东西,特别是在调试期间

在这里,您希望
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;
}