简体   繁体   English

我在什么时候返回该查询的数据?

[英]At what point do I return the data from this query?

I have this method for querying a database with an event on row. 我有这种方法来查询带有事件的数据库。 How do I know when all rows have been iterated through? 我怎么知道何时所有行都经过迭代?

I'm not sure when you return when all rows have been processed. 我不确定何时返回所有行。 The below code seems to cause issues. 下面的代码似乎会引起问题。

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

    });

},

Any help is appreciated! 任何帮助表示赞赏!

You can't just return from asynchronous code, you need to use a callback. 您不仅可以从异步代码return ,还需要使用回调。 Pass a callback parameter into your getData function and then call it in Request s callback. callback参数传递到getData函数中,然后在Request的回调中调用它。

Also, according to the docs , you shouldn't be listening to the done event; 此外,根据docs ,您不应该监听done事件; you should just use Request 's callback. 您应该只使用Request的回调。 Relevant bit: 相关位:

This is a relatively low-level event, driven by the receipt of a TDS Done token. 这是一个相对较低级别的事件,受TDS Done令牌的接收驱动。 Most uses of Tedious can ignore this event, and should rely on the Request's callback function to know when the request has completed. Tedious的大多数用法都可以忽略此事件,并且应该依靠Request的回调函数来知道请求何时完成。

With that in mind, you'll want to do something like this: 考虑到这一点,您将想要执行以下操作:

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

    });

}

Then to call it, you'd do: 然后调用它,您将执行以下操作:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM