【问题标题】:How to assign global variables using Node.js and Redis with for loop?如何使用带有 for 循环的 Node.js 和 Redis 分配全局变量?
【发布时间】:2013-07-01 15:22:35
【问题描述】:

我正在尝试使用“for”循环以编程方式从 Node.js 中的 Redis 数据库中检索值,以迭代 GET 请求。我正在使用“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

node.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 关联的值。同样,目的是在另一个节点模块中使用这些值。

这是与全局变量保护相关的问题吗?有什么明显的选择吗?绝对觉得我错过了一些明显的东西。

【问题讨论】:

    标签: javascript node.js redis node-redis


    【解决方案1】:

    client.get 是一个async 函数。 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 设为全局来与其他文件共享。 我建议您为vals 编写asynchronous getter 函数并制作其他文件来调用该函数以获取vals

    【讨论】:

    • 这是有道理的。因此,如果我将 vals 数组与同一节点服务器中的“稍后”节点模块一起使用,它应该全部正确存储在该数组变量中?
    猜你喜欢
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 2020-08-20
    • 2015-04-23
    • 2019-09-14
    • 1970-01-01
    • 2014-04-10
    • 2019-03-10
    相关资源
    最近更新 更多