所以我在让模块返回我想要的值时遇到了很多麻烦。基本上它会查看我的文件系统并返回最后创建的GIF文件。如果没有GIF,它会查找PPM(另一种文件类型)并生成GIF并返回。如果没有PPM,它将查看MySQL数据库并根据其中的内容生成GIF。所有这一切都很好。
在Express中使用HTTP请求调用此模块,其中currentImg()正在调用模块:
//REQUEST CURRENT IMAGE
app.get('/img', function(req, res) {
console.log(currentImg());
});
此请求始终返回'undefined'。我已经尝试了一些调试,模块在完成从module.exports函数中的'queryDatabase(returnFile)'行返回之前返回'undefined'。
// CurrentImg
module.exports = function() {
imageFile = "";
queryDatabase(returnFile);
return imageFile;
}
function queryDatabase(callback) {
imageFile = "";
client.query("SHOW TABLES FROM mathsDB", function(err, result) {
if (err)
console.log(err);
else
currentImage = result[result.length - 1]["Tables_in_mathsDB"];
currentImage = currentImage.substring(5);
callback;
});
}
function returnFile() {
fs.stat("./img/image" + currentImage + ".gif", function(err, stat) {
if (err==null) {
imageFile = "/img/image" + currentImage + ".gif";
return imageFile;
}
else {
fs.stat("./img/image" + currentImage + ".ppm", function(err, stat) {
if (err==null) {
convert.convert("image" + currentImage);
imageFile = "/img/image" + currentImage + ".gif";
return imageFile;
}
else {
exportPPM.make();
setTimeout(waitConvert, 500);
function waitConvert() {
convert.convert("image" + currentImage);
imageFile = "/img/image" + currentImage + ".gif";
return imageFile;
}
}
});
}
});
}
我已经尝试过对回调进行一些阅读,正如您在我的代码中看到的那样,但这似乎没有解决任何问题。我已经读过一些承诺,但它们似乎也没有提供可靠的解决方案。
任何人都可以向我提供正确方向的指针,以便以非阻塞方式运行吗?
感谢。
答案 0 :(得分:0)
使用async waterfall一个接一个地串联运行函数。 https://github.com/caolan/async#waterfall。 就像这样。
async.waterfall([
function (callback) {
imageFile = "";
client.query("SHOW TABLES FROM mathsDB", function(err, result) {
if (err)
console.log(err);
else
currentImage = result[result.length - 1]["Tables_in_mathsDB"];
currentImage = currentImage.substring(5);
callback(currentImage)
});
},
function(currentImage, callback) {
// arg1 now equals 'one' and arg2 now equals 'two'
fs.stat("./img/image" + currentImage + ".gif", function(err, stat) {
if (err==null) {
imageFile = "/img/image" + currentImage + ".gif";
return imageFile;
}
else {
fs.stat("./img/image" + currentImage + ".ppm", function(err, stat) {
if (err==null) {
convert.convert("image" + currentImage);
imageFile = "/img/image" + currentImage + ".gif";
return imageFile;
}
else {
exportPPM.make();
setTimeout(waitConvert, 500);
function waitConvert() {
convert.convert("image" + currentImage);
imageFile = "/img/image" + currentImage + ".gif";
return imageFile;
}
}
})
}
callback(null,currentImage) })
}
], function (err, currentImage) {
console.log(currentImage);
});