2016-11-19 51 views
1

我试图构建一个应用程序,要求我为每个视图/控制器创建多个查询。Node.js中的多个从属SQL查询

我试图使用嵌套结构异步执行,但sql结果在内部闭包中未定义。

这是使用这样做IM的功能:

var conn = db.config(mysql); 

function run_queries(conn,callback) { 

    conn.query(sql1, var1, function(err, res1) { 

     if(err){ callback(err); return; } 

     console.log(res1);  // RETURNS SUCCESSFULLY! 

     conn.query(sql2, var2, function(err, res2) { 

      if(err){ callback(err); return; } 

      console.log(res2); // UNDEFINED :(

      callback(null, res2); 

     }); 

    }); 

} 

run_queries(conn,function(err, result){ 

    console.log(result);  // UNDEFINED :(

}); 

我检查我的SQL,它是没有错误。如果我将sq1与sq2交换,则外部闭包将返回sq2的正确查询。

内部闭包不会返回查询。

+0

为什么不使用异步模块代码的

实例? –

+0

Im新的节点,不知道如何应用它在这种情况下 – yevg

+0

http://caolan.github.io/async/了解异步是非常重要的。我将使用async.parallel并为您提供示例。 –

回答

2

异步对异步调用非常有用。您可以使用异步模块使代码保持良好状态。使用async.parallel

var conn = db.config(mysql); 
var async = require('async'); 

function run_queries(conn, cb) { 


    async.parallel({ 

     res1: function (cb) { 

     conn.query(sql1, var1, function (err, res1) { 
      if (err) { cb(err) } 
      else { cb(null, res1) } 
     }) 
     }, 
     res2: function (cb) { 

     conn.query(sql2, var2, function (err, res2) { 
      if (err) { cb(err) } 
      else { cb(null, res2) } 
     }) 
     } 
    }, 
    function (err, result) { 
     if (err) { cb(err) } 
     else { cb(null, result) } 
    }) 

} 

run_queries(conn, function (err, result) { 
    console.log(result);  // UNDEFINED :(
    // GET OBJECT OF res1 AND res2 
}); 
+0

这工作,结构更简单,这样我可以创建一个任意数量的查询函数。谢谢!! – yevg