节点.js + Express - 在完成之前返回未定义的回调
Node.js + Express - Callbacks returning undefined before Complete
所以我遇到了真正的麻烦 - 被困了几个星期。
我的第一个函数查询 MySQL 数据库并返回一个响应,然后在我的第二个函数中进行处理。
问题是JS是单线程的,我不知道如何让它按照我想要的顺序运行:
- 触发函数 1。
- 该函数获取数据库响应,然后进行处理。
- 响应被传递给函数 2,然后函数 2 执行更多处理。
然而,目前,程序直接跳转到函数二,没有时间进行查询,函数最终返回"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;
}
});
}
});
}
您将结果作为回调的第一个参数返回,但它应该是第二个参数 - 换句话说,您正在用结果填充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
});
}
这应该可以解决您的问题。
这应该有效:
//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);
}
只是改变
client.query("[QUERY]", function(err, result) {
callback(null, result);
});
自:
client.query("[QUERY]", function(err, result) {
if( err) return callback(err);
return callback(null, result);
});
相关文章:
- 这.SOMETHING 总是返回未定义的 - extjs
- React+Meteor:this.ops返回未定义
- 解析-为什么user.getSessionToken()返回未定义的结果
- Javascript函数返回未定义
- JavaScript-获取数据属性的值返回未定义的值
- .val()返回未定义的.text返回随机代码
- 为什么innerHTML返回“未定义”
- "这个“;正在返回未定义的
- 谷歌地图:函数返回未定义的值在console.log中运行良好
- Javascript json返回未定义
- importScripts在web工作程序中返回未定义的
- 访问嵌套 json 对象的属性将返回未定义
- NativeAppEventEmitter返回未定义的
- 我的函数返回“未定义”
- 新手Javascript函数返回未定义的石头剪刀游戏
- Nodejs模块函数返回未定义的,而不是异步的
- .getElementById在.createTextNode中返回未定义
- javascript函数不返回未定义的值
- Typeahead的Javascript类型返回未定义
- Javascript可见元素返回未定义