Node.js + Express - 在完成

时间:2016-04-20 12:15:25

标签: javascript node.js express callback

所以我真的遇到了麻烦 - 已经坚持了好几个星期。

我的第一个函数查询MySQL数据库并返回一个响应,然后在我的第二个函数中处理它。

问题是JS是单线程的,我无法弄清楚如何让它以我想要的顺序运行:

  1. 触发功能1。
  2. 该函数获取数据库响应,然后进行处理。
  3. 响应被传递给功能2,然后功能2进行更多处理。
  4. 但是目前,程序直接跳转到第二个功能而没有时间进行查询,并且该功能最终返回' 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;
                                        }
                                });
                        }
                });
        }
    

3 个答案:

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