2013-05-21 57 views
0

我試圖完成以下(應該是很基本的,我必須失去了一些東西簡單):的Node.js/JavaScript的異步調用背部問題

  1. 調用具有字符串的函數具有select語句
  2. 等到DB調用完成和行(或JSON當量)返回
  3. 填充HTTP對象即可返回

這裏是代碼:

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中的匿名回調函數。

我在這裏做錯了什麼?

更新

由於本 我還發現,在同一條直線上的解決方案...這裏是新代碼:

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)) ; 
     }); 
    } 
}; 

回答

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)); 
     }); 
    } 
};