如何使用nodejs获取异步数据

Dav*_*ave 0 javascript mysql asynchronous callback node.js

我正在尝试使用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];
     });

}
Run Code Online (Sandbox Code Playgroud)

我知道这是有效的,因为我正在将结果写入控制台。问题是数据永远不会返回到下面的调用节点 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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Som*_*ens 5

您正在尝试同步返回异步数据。相反,添加一个回调到 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];
});
Run Code Online (Sandbox Code Playgroud)

并这样使用它:

venueTable.getVenueById(db, id, function(data) {
  console.log(data);
});
Run Code Online (Sandbox Code Playgroud)

需要注意的是:传统上,回调将第一个参数作为错误(或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];
});
Run Code Online (Sandbox Code Playgroud)

并这样使用它:

venueTable.getVenueById(db, id, function(err, data) {
  if (err) { return console.log(err); }
  console.log(data);
});
Run Code Online (Sandbox Code Playgroud)