如何使用nodejs获取异步数据

时间:2014-03-27 01:20:42

标签: javascript mysql node.js asynchronous callback

我试图使用nodejs从mysql表中获取数据。我调用另一个节点js文件中的sql例程。但是,我无法让我的回调返回数据。我认为问题可能是我从节点js文件而不是从角度或常规javascript程序调用异步例程。下面是我正在调用的导出脚本。

exports.getVenueById = function(db, id) {
    var http = require('http');
    var mysql = require('mysql');

    var query = "SELECT *  FROM venues WHERE auto_increment = ? "
    query = mysql.format(query, id);
    console.log("query=" + query);

db.query(
    query,
    function(err, rows) {
        if(err) console.log("error=" + err);
        console.log("rows=" + rows[0]['auto_increment']);
        res.json({success: true, response: rows});
        //return rows[0];
     });

}

我知道这是有效的,因为我正在将结果写入控制台。问题是数据永远不会回到下面的调用节点js例程。

function getVenueData (id , callback)  {             
  (function () {
     venueData = venueTable.getVenueById(db, id);           
     if(venueData) {
         callback();
         console.log("callback in loop");
      }
      console.log("callback after loop");        
  });        
}

getVenueData(id, gotVenueData);

程序立即返回并显示超时消息。我承认我不是nodejs或其回调功能的专家。对于如何让程序等待异步数据返回调用程序,我将不胜感激。

function gotVenueData() {
  console.log("gotVenueData");
}

setTimeout(function() { console.log("timeout for 10 seconds");} , 10000);
console.log("venuedata=" + venueData);

1 个答案:

答案 0 :(得分:4)

您正在尝试同步返回异步数据。相反,添加一个回调到getVenueById:

exports.getVenueById = function(db,id,cb){     var http = require('http');     var mysql = require('mysql');

var query = "SELECT *  FROM venues WHERE auto_increment = ? ";
query = mysql.format(query, id);
console.log("query=" + query);

db.query(
query,

function (err, rows) {
    if (err) console.log("error=" + err);
    console.log("rows=" + rows[0]['auto_increment']);
    cb({
        success: true,
        response: rows
    });
    //  return rows[0];
});

并使用它:

venueTable.getVenueById(db, id, function(data) {
  console.log(data);
});

一个警告:传统上,回调的第一个参数是错误(或null),然后是实际数据。考虑到这一点:

exports.getVenueById = function(db,id,cb){     var http = require('http');     var mysql = require('mysql');

var query = "SELECT *  FROM venues WHERE auto_increment = ? ";
query = mysql.format(query, id);
console.log("query=" + query);

db.query(
query,

function (err, rows) {
    if (err) { cb(err); }
    console.log("rows=" + rows[0]['auto_increment']);
    cb(null, {
        success: true,
        response: rows
    });
    //  return rows[0];
});

并使用它:

venueTable.getVenueById(db, id, function(err, data) {
  if (err) { return console.log(err); }
  console.log(data);
});