Node js中事件驱动的异步回调

时间:2013-12-02 05:24:30

标签: node.js express

有没有办法阻止node.js的异步回调属性? 请建议......

例如,

var express = require('express');
var app = express();
var MongoClient = require('mongodb').MongoClient,
    format = require('util').format;
var cors = require('cors');

app.get('/gantt', cors(), function (request, response) {
    MongoClient.connect('mongodb://127.0.0.1:27017/test', function (err, db) {
        if (err) throw err;

        var collection = db.collection('ganttdata');
        collection.find({}, {
            "_id": 0
        }).toArray(function (err, results) {
            var jsonString = JSON.stringify(results);
            response.setHeader('Content-Type', 'text/plain');
            response.send('{\"data\":' + jsonString + '}');
        });

    });
});

app.listen(3000);
console.log('Listening on port 3000...');

尽管Node.js首先打印控制台语句,但我希望执行app.get()。 我的场景与上面的场景相同。

这是我的情景

var ganttresult = new Array();
app.get('/get', cors(), function (request, response) {
    console.log('hello');
    connection.query("SELECT distinct id FROM ganttdata", function (err, rows) {
        if (err) {
            console.log('error in fetching  ' + err);
        } else {
            var all_id = rows;
            for (var j = 0; j < all_id.length; j++) {
                console.log('hello1');
                connection.query("SELECT id,tailName FROM ganttdata where id= '" + all_id[j].id + "'", function (err, rows) {
                    if (err) {
                        console.log('error in fetching  ' + err);
                    } else {
                        var jsonString1 = rows;

                        var set_id = jsonString1[0].id;


                        connection.query("SELECT item_id,name,start,end FROM ganttdata  where id= '" + set_id + "'", function (err, rows) {
                            if (err) {
                                console.log('error in fetching  ' + err);
                            } else {
                                var jsonString2 = rows;
                                var gantt1 = new Object();
                                gantt1.id = jsonString1[0].id;
                                gantt1.tailName = jsonString1[0].tailName;
                                var series = new Array();

                                for (var i = 0; i < jsonString2.length; i++) {
                                    var gantt2 = new Object();
                                    gantt2.item = jsonString2[i];
                                    series.push(gantt2);
                                    gantt1.series = series;


                                }
                                //console.log(gantt1);
                                console.log('hi');

                                ganttresult.push(gantt1);
                                console.log(ganttresult);




                            }
                        });



                    }
                });
            }
            var result = JSON.stringify(ganttresult);
            console.log(result);
            response.send('{\"data\":' + result + '}');
            response.end();

        }
    });

});

当我运行此代码时, 我得到一个空的结果集,当我重新运行时,我得到了结果。 我想这是由于节点js的异步回调性质。 请建议......

由于

我尝试过async.waterfall方法,如下所示

app.get('/get',cors(), function(request,response) {

 async.waterfall([
 function(result) {
connection.query("SELECT id FROM Gantt",function(err, rows) {
    if (err) {
    console.log('error in fetching  ' + err);   
  }
  else{  
  var all_id=rows;  

  for(var j=0;j<all_id.length;j++){

    connection.query("SELECT id,tailName FROM Gantt where id= '"+all_id[j].id+"'",function(err, rows) {
     if (err) {
    console.log('error in fetching  ' + err);   
  }
  else{  
      var jsonString1=rows;

    var set_id=jsonString1[0].id;


    connection.query("SELECT item_id,name,start,end FROM GanttFlight  where id= '"+set_id+"'",function(err, rows) {
         if (err) {
    console.log('error in fetching  ' + err);   
  }
  else{  
    var jsonString2=rows;   
     var gantt1=new Object();
    gantt1.id=jsonString1[0].id;
    gantt1.name=jsonString1[0].tailName;
    var series = new Array();
        series=[];
    for(var i=0;i<jsonString2.length;i++){
     var gantt2=new Object();
    gantt2.item=jsonString2[i];
    series.push(gantt2);    
    gantt1.series=series;


    }

ganttresult.push(gantt1);





      }    
 });



}  
 });
 }
var result= JSON.stringify(ganttresult);
console.log(ganttresult);

response.send(ganttresult);
ganttresult=[];
//response.send('{\"data\":'+result+'}');
response.end();



 }
 });
 }
 ],   function(err, status) {
        console.log(status);
    });
});
app.listen(3000);
console.log('Listening on port 3000...');

我首先获得空结果,当刷新浏览器时,我得到了所需的结果

请建议

0 个答案:

没有答案