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)
您正在尝试同步返回异步数据。相反,添加一个回调到 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)
| 归档时间: |
|
| 查看次数: |
835 次 |
| 最近记录: |