Node.JS / JavaScript异步回调问题

时间:2013-05-21 00:37:08

标签: node.js asynchronous callback anonymous-function

我正在努力完成以下事项(应该是非常基本的,我必须遗漏一些微不足道的事情):

  1. 使用包含select语句的字符串调用函数
  2. 等待数据库调用完成并返回行(或等效的json)
  3. 填充http对象以返回
  4. 这是代码:

        util.js
    exports.execute = function( query){
        if (connection) {
            connection.query(query, function(err, rows, fields) {
                if (err) throw err;
                console.log("from Util - " + JSON.stringify(rows));
                return JSON.stringify(rows);
            });
        }
    };
    
    repo.js
    var q =  "select * from xxx";
        var response;
        util.execute(q,  function (err,  r){
                if (err){
                    throw err;
                    console.log(err);
                }
                else {
                    console.log(r);
                    res.contentType('application/json');
                    res.write(r);
                    res.end();
                }
            });
    

    我的问题是,当util.js中的代码被调用时,我可以在控制台中看到json,它永远不会回到repo.js中的匿名回调函数。

    我在这里做错了什么?

      

    更新

    谢谢Ben 我也在同一行找到了解决方案......这里是新代码:

    repo.js:
    var send_data = function (req, res, r){
        res.contentType('application/json');
        res.write(r);
        res.end();
    
    }
    exports.all = function(req, res){
        var q =  "select * from XXX";
        var response;
        util.execute(req, res,q,  send_data);
    };
    
    util.js:
    exports.execute = function(req, res,  query, callback){
        if (connection) {
            connection.query(query, function(err, rows, fields) {
                if (err) throw err;
                callback(req, res, JSON.stringify(rows))  ;
            });
        }
    };
    

1 个答案:

答案 0 :(得分:0)

util.execute只接受代码中的一个参数。它需要接受第二个回调参数才能以您的方式使用它。 (回调不是魔术,它们只是函数调用)

类似的东西:

exports.execute = function(query,callback){
    if (connection) {
        connection.query(query, function(err, rows, fields) {
            if (err) throw err;
            console.log("from Util - " + JSON.stringify(rows));
            callback(null,JSON.stringify(rows));
        });
    }
};

如果您希望它的行为一致并接受错误参数,您可能需要填写:

exports.execute = function(query,callback){
    if (connection) {
        connection.query(query, function(err, rows, fields) {
            callback(err,null);
            console.log("from Util - " + JSON.stringify(rows));
            callback(null,JSON.stringify(rows));
        });
    }
};