2014-08-29 30 views
0

我有这种方法用于查询数据库上的一行事件。我如何知道所有行何时迭代完成?我从哪个点返回此查询中的数据?

我不确定何时返回所有行已处理。下面的代码似乎会导致问题。

getData : function(data){ 
    var connection = new Connection(config); 
    var newdata = []; 
    var dataset = []; 
    connection.on('connect', function(err) { 

     var sql = "SELECT * FROM dbo."+data.entity+" WHERE "+data.field+" LIKE '%"+data.params+"%'"; 

     var Request = require('tedious').Request; 
     var request = new Request(sql, function (err, rowCount) { 
      if (err) { 
       return false; 
      } else { 
       if (rowCount < 1) { 
        return false; 
       } 
      } 
     }); 

     request.on('row', function(columns) { 

      columns.forEach(function(column) { 
        dataset.push({ 
         col: column.metadata.colName, 
         val: column.value 
        }); 


      }); 

      newdata.push(dataset); 

     }); 

     request.on('done', function(){ 
      //connection.close(); 
      return newdata; 
     }) 

     connection.execSql(request); 

    }); 

}, 

任何帮助表示赞赏!

回答

3

你不能只是从异步代码return,你需要使用回调。将callback参数传递给您的getData函数,然后在Request的回调函中调用它。

此外,根据docs,您不应该听done事件;你应该只使用Request的回调。相关位:

这是一个相对较低级的事件,由 收到TDS Done令牌驱动。大多数Tedious的使用可以忽略这个事件,并且应该依靠请求的回调函数来知道何时请求已经完成。

考虑到这一点,你会想要做这样的事情:

getData : function(data, callback){ 
    var connection = new Connection(config); 
    var newdata = []; 
    var dataset = []; 
    connection.on('connect', function(err) { 

     var sql = "SELECT * FROM dbo."+data.entity+" WHERE "+data.field+" LIKE '%"+data.params+"%'"; 

     var Request = require('tedious').Request; 
     var request = new Request(sql, function (err, rowCount) { 
      if (err) { 
       callback(err); 
      } else { 
       if (rowCount < 1) { 
        callback(null, false); 
       } else { 
        callback(null, newdata); 
       } 
      } 
     }); 

     request.on('row', function(columns) { 

      columns.forEach(function(column) { 
        dataset.push({ 
         col: column.metadata.colName, 
         val: column.value 
        }); 


      }); 

      newdata.push(dataset); 

     }); 

     connection.execSql(request); 

    }); 

} 

然后调用它,你会做:

getData(data, function(err, rows) { 
    if (err) { 
     // Handle the error 
    } else if (rows) { 
     // Process the rows returned from the database 
    } else { 
     // No rows returns; handle appropriately 
    } 
});