我有这种方法用于查询具有行上事件的数据库。我如何知道所有行何时迭代完毕?
我不确定何时处理完所有行后返回。以下代码似乎会导致问题。
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);
});
},
感谢任何帮助!
答案 0 :(得分:4)
您不能从异步代码中return
,您需要使用回调。将callback
参数传递到getData
函数,然后在Request
回调中调用它。
另外,根据docs,你不应该听done
事件;你应该使用Request
的回调。相关位:
这是一个相对低级别的事件,由 收到TDS完成令牌。 Tedious的大多数用法都可以忽略这一点 事件,应该依赖Request的回调函数来知道什么时候 请求已经完成。
考虑到这一点,你会想要做这样的事情:
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
}
});