【问题标题】:How can I structure these callbacks to get me the info I want?如何构建这些回调以获取我想要的信息?
【发布时间】:2015-06-19 00:52:54
【问题描述】:

也许我一直盯着我的代码太久了,或者也许我在别处使用了太多回调或其他什么,但我无法弄清楚这个的逻辑。我知道rows 中包含的值是正确的,因为在该回调函数中使用util.inspect(rows)。我只是不知道如何把它带回表面,可以这么说。 dbHandler() 从传递参数的其他函数调用,并期望返回结果。

任何见解都会非常有帮助。

将 node.js 与 Express 和 mysql 包一起使用,如果这样会有所不同的话。

function dbHandler(req, res, params) {
    pool_user.getConnection(function (err, connection) {
        if (err) {
            connection.release();
            res.json({
                "code"   : 100,
                "status" : "Error in connection database"
            });
            return;
        }
        connection.query(params.query_string, function (err, rows) {
            connection.release();
            if(!err) {
                res.json(rows);  // <<--- I want to get ahold of the value of `rows`
                //console.log(util.inspect(rows));
            }           
        });
        connection.on('error', function(err) {
            res.json({
                "code"   : 100,
                "status" : "Error in connection database"
            });
            return;
        });
    });
}

【问题讨论】:

  • 异步。您在回调完成之前访问全局。
  • 您在哪里访问umadbro?如果您不向我们展示代码中umadbro 意外变为undefined 的部分,我们将无法帮助您修复它。
  • @Bergi 抱歉,我正在进行增量帖子编辑。 :P 我没有使用umadbro。我的问题因其他原因而感到困惑(我的错)。
  • 好吧,不管现在的问题:res.json 似乎非常擅长“将价值带回表面”,不是吗?如果那些调用dbHandler的其他函数,那么他们应该只提供自己的回调,然后需要调用而不是res.json

标签: javascript node.js scope


【解决方案1】:

试图返回异步函数的结果是一种反模式,永远不会奏效。

相反,重构调用代码。

Not Like This - 匿名回调不会返回给调用者

new_data = api_request_data(auth, request, 
      function(error, data){ 
          return data;
});
store(new_data);
update_screen(new_data);

更好

api_request_data(auth, request, 
       function(error, data){ 
          store(data);
          update_screen(data);
});

最佳

api_request_data(auth, request, 
       function(error, data){
          if (error){ 
                console.log(error);
                return;
          } 
          store(data);
          update_screen(data);
});

在您的代码中,数据管道看起来没问题。

connection.query(params.query_string, function (err, rows) {
        connection.release();
        if(!err) {
            res.json(rows);  // <<--- I want to get ahold of the value of `rows`
            //console.log(util.inspect(rows));
        }           
    });

node.js 应用程序中的代码res.json(rows); 将包含rows 中的数据的JSON 字符串排队,以写入res 中引用的当前Web 连接。

您的问题表明问题在于该行不会将数据返回给 dbHandler() 的调用者,但没有受过训练的 node.js 开发人员会期望这种情况发生。该代码在将rows 中的数据传送到node.js 应用程序的网络客户端时看起来是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-17
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多