JavaScript / Node.js + Express - 在完成

时间:2016-04-14 22:59:09

标签: javascript node.js express callback

所以我在让模块返回我想要的值时遇到了很多麻烦。基本上它会查看我的文件系统并返回最后创建的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;
                                    }
                            }
                    });
            }
    });
}

我已经尝试过对回调进行一些阅读,正如您在我的代码中看到的那样,但这似乎没有解决任何问题。我已经读过一些承诺,但它们似乎也没有提供可靠的解决方案。

任何人都可以向我提供正确方向的指针,以便以非阻塞方式运行吗?

感谢。

1 个答案:

答案 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);
});