所以我真的遇到了麻烦 - 已经坚持了好几个星期。
我的第一个函数查询MySQL数据库并返回一个响应,然后在我的第二个函数中处理它。
问题是JS是单线程的,我无法弄清楚如何让它以我想要的顺序运行:
但是目前,程序直接跳转到第二个功能而没有时间进行查询,并且该功能最终返回' undefined'。
var test = functionOne (functionTwo);
console.log(test); //returning 'undefined'
function functionOne(callback) {
//QUERY TAKES A LONG TIME
client.query("[QUERY]", function(err, result) {
callback(null, result);
});
}
function functionTwo(err, result) {
//More processing - slightly slow
return result;
}
编辑:
这是完整档案。
var client = require('./dbHelper');
var convert = require('./genGIF');
var exportPPM = require('./makePPM');
var fs = require('fs');
module.exports = function() {
var test = queryDatabase (handleResult);
console.log("print: " + test);
}
function queryDatabase(callback) {
//Query our database
client.query("SHOW TABLES FROM mathsDB", function(err, result) {
if (err) {
callback(err);
}
else {
//Calculate the length of our table and then the last image in the table
var currentImage = result[result.length - 1]["Tables_in_mathsDB"];
currentImage = currentImage.substring(5);
callback(null, currentImage);
console.log(currentImage);
}
});
}
function handleResult(err, currentImage) {
fs.stat("./img/image" + currentImage + ".gif", function(err, stat) {
if (err==null) {
var imageFile = "/img/image" + currentImage + ".gif";
return imageFile;
}
else {
//Check if we have a .PPM file made for the image instead, then generate a .GIF
fs.stat("./img/image" + currentImage + ".ppm", function(err, stat) {
if (err==null) {
convert.convert("image" + currentImage);
var imageFile = "/img/image" + currentImage + ".gif";
return imageFile;
}
else {
//Generate the .GIF if no .GIF or .PPM already.
exportPPM.make();
convert.convert("image" + currentImage);
var imageFile = "/img/image" + currentImage + ".gif";
return imageFile;
}
});
}
});
}
答案 0 :(得分:2)
您将结果作为回调的第一个参数返回,但预计会成为第二个参数 - 换句话说,您将使用结果填充err
参数,因此参数result
将始终为undefined
。
所以改变:
function functionOne(callback) {
//QUERY TAKES A LONG TIME
client.query("[QUERY]", function(err, result) {
callback(result);
});
}
对此:
function functionOne(callback) {
//QUERY TAKES A LONG TIME
client.query("[QUERY]", function(err, result) {
callback(null, result); // pass it as the second argument
});
}
那应该可以解决你的问题。
答案 1 :(得分:1)
只需更改
client.query("[QUERY]", function(err, result) {
callback(null, result);
});
到:
client.query("[QUERY]", function(err, result) {
if( err) return callback(err);
return callback(null, result);
});
答案 2 :(得分:1)
这应该有效:
//start execution
functionOne (functionTwo);
function functionOne(callback) {
//QUERY TAKES A LONG TIME
client.query("[QUERY]", function(err, result) {
callback(null, result);
});
}
function functionTwo(err, result) {
//call function done after long processing is finished with result
done(err,result);
}
function done(err,result){
//do your final processing here
console.log(result);
}