异步功能不起作用

时间:2014-04-28 17:45:17

标签: javascript node.js asynchronous

我正在使用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 - 我知道这是非常蹩脚的错误处理;我不希望一直使用它,仅用于选择的东西,特别是在调试期间。

2 个答案:

答案 0 :(得分:2)

function asyncLoad2(className, id, callback) {
  redisClient.hget(className, id, function(err,res,callback) {

在这里,您希望redisClient通过callback - 但它没有,它只会传递两个errres参数。 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;
}