1

我使用了 node_sqlite3 模块,并尝试了以下示例:

var sqlite = require('sqlite3').verbose();
var db = new sqlite.Database("/var/www/signals/db/app3.db");

var matrixSignals = new Array();
var i;

i = 0;
db.all('SELECT * FROM tbl_signals', function(err,rows){
    rows.forEach(function(row) {
        matrixSignals[i] = new Object();
        matrixSignals[i].signalID = row.signalID;
        matrixSignals[i].connID = row.connID;
        i++;
    });
    db.close();
    console.log('1:' + matrixSignals.length);
});
console.log('2:' + matrixSignals.length);

在控制台输出 1 中,长度是正确的,但在控制台输出 2 中,长度始终为 0。我如何将 matrixSignals 设置为全局变量?

4

1 回答 1

3

这不起作用的原因与 Node.js 的一般操作方式有关。在node中,所有代码都是异步执行的;在您记录输出 2 时,matrixSignals 的长度仍然为 0。这是因为在您触发数据库查询后,代码会继续执行。日志输出 1 仅在数据库查询完成执行,这就是它返回正确结果的原因。

出于这个原因,您的问题的简单答案是无法将 matrixSignals 设置为全局变量。如果您的所有逻辑都真正依赖于该数组中的值,那么您的逻辑应该在数据库调用的回调中 - 这样它只有在从数据库中检索到数据后才执行该代码。如果你只是想让语法更简洁,你可能会使用 node-promise (https://github.com/kriszyp/node-promise) 之类的东西,但我认为这可能比它的价值更多。

于 2012-04-06T20:22:51.217 回答