Nodejs SQL连接和asynchronous模块

我一直在与Node.JS一起玩,我发现这个伟大的asynchronous库https://github.com/caolan/async 。 我想用这个replace传统的callback模型,因为它看起来更加令人愉快,而且更容易理解。

这是我的sql查询代码

function query_mssql(config, sql_string){ var connection = new sql.Connection(config, function(err) { // ... error checks if (err) { console.log('connection to mssql has failed'); //throw err; }else{ // Query var request = new sql.Request(connection); // or: var request = connection.request(); request.query(sql_string, function(err, recordset) { // ... error checks should go here : // output query result to console: console.log(recordset); return recordset; }); } 

}); }

我想知道如何使这个asynchronous,就像图书馆给出的例子。

  async.series([ function(callback){ // do some stuff ... callback(null, 'one'); }, function(callback){ // do some more stuff ... callback(null, 'two'); } ], // optional callback function(err, results){ // results is now equal to ['one', 'two'] }); 

有人可以帮我弄这个吗? 我不太明白错误报告是如何工作的。

基于克里斯的评论,瀑布方法如何在多层次调用时提供帮助?

 function computeCurrentDefinitionResult(database, node_name) { async.waterfall([ function(callback) { var leaf_sql_query = "SELECT * FROM "+ JSON.stringify(database) +".dbo.LeafNode WHERE NodeName=" + "'" + node_name + "'"; query_mssql_internal(leaf_sql_query, callback); console.log('Might BE HAPPY'); }, ], function(err, recordset) { // ... error checks should go here : if (err) { console.log('mssql query has failed'); } // output query result to console: console.log(recordset); return recordset; }); function query_mssql_internal(sql_string){ return query_mssql(config, sql_string); } 

“query_mssql()”调用你的函数。 如何将结果传递回顶部调用函数或错误返回?

为此,我相信你应该使用async.waterfall,因为你想传递每个asynchronous任务的结果。

下面是一个简单的例子。 你必须编辑它以适应你的需求。

如果在任务中发生错误,则会在最后移出可选方法。

 async.waterfall([ function(callback) { var connection = new sql.Connection(config, function(err) { callback(err, connection) } ); }, function(connection, callback) { var request = connection.request(); request.query(sql_string, callback); } ], function(err, recordset) { // ... error checks should go here : // output query result to console: console.log(recordset); }); 

正如你所看到的,你可以在callback中的错误之后添加参数,然后在下一个任务中接收它们。 这是async.waterfall的一个function。

这是一个testing的例子,以及…

 require("should"); var async = require("async"); describe("async test", function() { it('should do stuff', function(done){ async.waterfall([ function(callback){ a(callback); }, function(aResult, callback){ b(callback, aResult); } ], function(err, aResult, bResult) { console.log(aResult + " " + bResult); done(); }); function a(callback) { callback(null, 1); } function b(callback, aResult) { callback(null, aResult, 2); } }) }); 

至于你最后的编辑,你必须asynchronous返回你的值。 所以你不能使用return语句来获得你的结果。 这有一个涓滴效应,导致这些依赖关系也变得asynchronous。