如何使用节点js顺序访问多个表?

时间:2014-04-02 02:41:16

标签: javascript node.js asynchronous callback

我必须使用节点js从数据库访问多个表,并将结果添加到数组中。但是,由于节点异步运行,我无法弄清楚如何顺序访问表。在我可以访问下一个表之前,我需要保存一个表的结果。下面是我如何访问数据库以获取到达表的示例。

    function gettable1 (id, cb) {
    table1.getData1(connection, id, function(err, data) {
    if (err) { return console.log(err); }
    myArray += data.response;    
    cb();
    });  
    }

    function gettable2(id, cb) {
    table2.getData2(connection, id, function(err, data) {
    if (err) { return console.log(err); }
    myArray += data.response;    
    cb();
    });  
    }
     ... etc.
    function gettable5(id, cb) {
    table5.getData5(connection, id, function(err, data) {
    if (err) { return console.log(err); }
    myArray += data.response;    
    cb();
    });  
    }

     gettable1(id, callback);
     gettable2(id, callback);
     ....
     gettable5(id, callback);

     return myArray;

那么如何在执行gettable2之前确保调用gettable1?在完成任何表调用之前返回变量myArray。节点中的异步处理确实让我感到困惑,我很感激有关如何编写逻辑以使表顺序处理而不是异步处理的任何反馈。

3 个答案:

答案 0 :(得分:1)

您可以嵌套回调:

sql.query(myQuery, function() {
  sql.query(myNextQuery, function() {
    // etc....

或(我建议)使用像async这样的库。

答案 1 :(得分:0)

如果您希望它们是连续的,您需要嵌套回调。

gettable1(id, function(){
    gettable2(id, function(){
        gettable3(id, function(){
           // got all tables
        });
    });
});

当然,如果有太多级别,代码会变得有点难看,并且有很多方法可以通过各种权衡使它看起来更好。

答案 2 :(得分:0)

在您的情况下使用Promise。为每个函数调用创建Promise并使用

Promise1.then(function(result){
   Promise2.then(function(result){
      ....
   });
});