2

「for」ループを使用して GET 要求を反復処理する Node.js の Redis データベースからプログラムで値を取得しようとしています。「redis」ノード モジュールを使用しています。console.log を使用してこれらのリクエストの値をサーバーに出力することはできますが、これらの各値を別の node.js モジュールで使用するためにグローバル配列にプッシュすることはできません。これは、Redis スクリプトの「グローバル変数保護」の側面によるものかどうか疑問に思っています。また、ここで回避策があるかどうかも知りたいです。

redis-cli:

redis 127.0.0.1:6379> SET a "1"
OK
redis 127.0.0.1:6379> SET b "2"
OK
redis 127.0.0.1:6379> SET c "3"
OK

ノード.js:

var keys = ['a', 'b', 'c'];
var vals = [];
for(i=0; i<3; i++) {
    client.get(keys[i], function(err, reply) {
        console.log(reply);
        vals.push(reply);
    });
}
console.log(vals);

vals 配列が a、b、および c... または 1、2、および 3 に関連付けられた値をそれぞれ出力するようにしたいと考えています。繰り返しますが、目的はこれらの値を別のノード モジュールで使用することです。

これはグローバル変数の保護に関連する問題ですか? 明らかな代替手段はありますか?明らかな何かが欠けているように感じます。

4

1 に答える 1

0

client.getasync関数です。reply's期待どおりにプッシュさvalsれますが、すぐにはプッシュされません。近い将来、それらは にプッシュされvalsます。したがって、同期的にログを記録しようとすると、配列valsのみが取得されます。empty

async.jsを使用すると、次のようなことができます。

var vals;
var keys = ['a', 'b', 'c'];
var async = require('async');
async.map(keys, client.get, function(err, results) {
  vals = results;
  console.log(vals);//will print what you wanted.
});

valsただし、とにかく、グローバルにすることで他のファイルと共有することはできません。asynchronousgetter 関数をvals作成し、他のファイルを作成してその関数を呼び出して get することをお勧めしますvals

于 2013-07-03T19:29:36.237 に答える