javascript - 异步功能不起作用

标签 javascript node.js asynchronous

我正在使用 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 - 但事实并非如此,它只会传递两个 errres 参数。 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/

相关文章:

Javascript 淡出动画功能(无 jQuery)

javascript - jQuery 垂直 slider 保持滑动

javascript - 从除 1 以外的所有元素中删除类

javascript - 如何通过ajax使用多选过滤器

javascript - Nodejs等待用户输入?

javascript - 如何使用 amqp.node 使rabbitmq消息过期

java - 如何在 Java/Android 中迭代 Node.js 数据库查询结果

c# - 如何在 C# 应用程序中取消异步发送套接字

c# - 异步等待阻塞 ui wp8

c# - 直接调用 anon async Func 与使用 Task.Factory 之间的区别?