【问题标题】:How to update global variable through a function如何通过函数更新全局变量
【发布时间】:2017-09-30 18:01:31
【问题描述】:

我一直在尝试使用 MongoDB、Redis、NodeJS 和 socket.io 创建一个包含多个房间的聊天应用程序。我需要查询一个名为 roomDocumentState 的 Redis 列表并将值返回到一个变量中。这个变量必须在全局范围内,需要修改。

我尝试使用的代码只修改了函数中的局部变量。我读过它的东西叫做“关闭”。有人可以告诉我如何正确实施吗?

这里是从Redis中拉取数据并修改变量count_1的代码:

function checkRoomDocumentState() {
  var count_1 = 0;

  store.llen(roomDocumentState, (err, res) => {
    if (err) {
        throw err;
    }
    else {
        if (res > count_1) {
            count_1 = res;
            return count_1;
        }
    }
  });
}

所以这个函数的调用方式如下,这里有一段代码sn-p:

io.sockets.on('connection', client => {
  createWhiteboardRooms();
  sub.subscribe(roomDocumentState);
  store.lpush(roomDocumentState, event1);

  //added this to check if there's any value at all
  checkRoomDocumentState();
  console.log(checkRoomDocumentState()); 

  sub.on("message", (channel, message) => {
      console.log(message);
      client.send(message);
  });
});

【问题讨论】:

  • 你想如何使用count_1
  • 基本上,我有这个函数来检查redis列表中的值是否发生了变化。该值将使用 'llen' 获取,然后放入 count_1。第二个函数检查这个变量并做一些其他的事情
  • 我问的不是这个变量是如何初始化,而是如何使用。你在哪里打电话checkRoomDocumentState?如果你想在调用后立即使用这个变量,它将未定义,因为checkRoomDocumentState是异步函数。
  • 编辑帖子以显示此内容
  • 嘿,my first SO question 差不多!

标签: javascript node.js redis


【解决方案1】:

如果你要全局化的变量是count_1,那么你必须去掉它前面的var关键字。

但是,正如下面评论中所解释的,最好使用回调来传递值:

function doSomethingAsync(resultIsAvailable) {
  redis.doSomethingElseAsync((err,res) => {
    result = 'redis told me ' + res;
    resultIsAvailable(result);
  });
}

doSomethingAsync((result) => {
  console.log('my function has been told by redis that ' + result);
});

【讨论】:

  • 如果我这样做了,那么我会在我的 IDE 中看到一个“未定义的变量”错误......抱歉,我有点困惑,我已经搞砸了一段时间了。
  • 您不应该为您的用例使用全局变量。通过回调传递结果更简洁、更容易:1) 将函数的签名更改为 checkRoomDocumentState(resultAvailable),2) 在计算 count_1 的函数中调用 resultAvailable(count_1)。在调用 checkRoomDocumentState 的代码中,提供您的回调函数。
  • 你能告诉我怎么做吗?我现在对此感到非常困惑。我只是不知道如何实现它。
猜你喜欢
  • 2019-10-03
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
  • 2020-09-09
  • 2022-09-22
  • 2017-01-23
  • 1970-01-01
相关资源
最近更新 更多