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 の一般的な動作に関係しています。ノードでは、すべてのコードが非同期で実行されます。出力 2 をログに記録している時点では、matrixSignals の長さは 0 のままです。これは、データベース クエリを実行した後もコードが実行され続けるためです。ログ出力 1 は、データベース クエリが終了した後にのみ実行されるため、正しい結果が返されます。

このため、あなたの質問に対する簡単な答えは、matrixSignals をグローバル変数に設定する方法がないということです。すべてのロジックがその配列の値に本当に依存している場合、ロジックはデータベース呼び出しへのコールバック内にある必要があります。これにより、データがデータベースから取得された後にのみそのコードが実行されます。構文をきれいにしたいだけなら、node-promise (https://github.com/kriszyp/node-promise) のようなものを使用できる可能性がありますが、それはおそらくその価値よりも多くの労力だと思います。

于 2012-04-06T20:22:51.217 に答える