Javascript nodejssql连接和异步模块

Javascript nodejssql连接和异步模块,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我一直在使用Node.JS,发现了这个很棒的异步库。我想用这个来代替传统的回调模型,因为它看起来更令人愉快,更容易理解 这是我的sql查询代码 function query_mssql(config, sql_string){ var connection = new sql.Connection(config, function(err) { // ... error checks if (err) { console.log('connection to mssql

我一直在使用Node.JS,发现了这个很棒的异步库。我想用这个来代替传统的回调模型,因为它看起来更令人愉快,更容易理解

这是我的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;
    });

  } 
}); }

我想知道如何使它异步,就像库中给出的示例一样

    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']
   });
有人能帮我吗?我不太明白错误报告是如何工作的

根据Chris的评论,如果在多层中调用瀑布方法,它到底有什么帮助

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

查询将调用您的函数。如何将结果传递回top调用函数或返回错误?

对于这一点,我认为您应该使用,因为您希望在每个异步任务中传递结果

下面是一个简单的例子。您必须对其进行编辑以满足您的需要

如果任务中发生错误,它将在最后转移到可选方法

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);
});
如您所见,您可以在回调中的错误之后添加参数,然后在下一个任务中接收它们。这是我的一个特点

这里还有一个测试示例

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

   })
});

对于上一次编辑,必须异步返回值。因此,您不能使用return语句来获得结果。这会产生涓涓效应,导致这些依赖关系也变得异步。

这将不起作用:调用回调时,第一个函数中不会出现错误,第二个函数中也会出现错误。您必须这样做,让async知道您完成了,它可以执行下一个函数。我假设如果这些函数成功,那么这些函数的错误将为null。我认为在这种假设下是可以的。你能解释一下吗?我不理解异步,知道你已经完成了。Chris,这很有趣,但是当我使用多层调用时,这个方法有效吗?我将写一条单独的注释来解释这一点。@Cris没问题,但即使错误为null,也应该调用回调函数,如callbacknull、connection,否则瀑布函数将永远不会被通知您已经完成了所做的工作。