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

    });

},

任何帮助表示赞赏!

4

1 回答 1

4

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

另外,根据文档,您不应该收听该done事件;你应该只使用Request'回调。相关位:

这是一个相对较低级别的事件,由收到 TDS Done 令牌驱动。大多数 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
    }
});
于 2014-08-29T01:50:52.077 回答