【问题标题】:Retrieving variable out of event handler scope从事件处理程序范围内检索变量
【发布时间】:2017-05-04 20:45:37
【问题描述】:

目前正在使用 Websockets 和 node.js 进行项目。目前我正在生成一些随机数并每半秒将它们发送给客户端。

    var array = [];

wss.on("connection", function (ws) {
    setInterval(function () {
        var data  = Math.floor(Math.random() * 100) + 1;    //create a random whole number between 1-100
        var msg = JSON.stringify(data);                     //convert data to JSON string
        ws.send(msg);                                       //send JSON string to client
    }, 500);


})

但是现在我想每分钟将那一分钟的值存储到数据库中。我不想在 wss.on 函数中将我的插入嵌套到 mongodb 中,因为它看起来很乱。我有没有办法让data 的值超出wss.on 的范围并进入array

我尝试过使用array.push(),但显然它不起作用。任何有关此问题的帮助和必读的链接将不胜感激。

【问题讨论】:

  • 你认为“乱七八糟”的做法才是正确的做法。嵌套它。如果你真的想,你可以把插入放在一个单独的函数中,然后从间隔中调用它。异步计时仅在异步回调中有效,因此您可以在其中进行工作。您可以将data 放入更高范围的数组并将其存储在那里,但是仅在setInterval() 回调中知道刚刚将值添加到数组中的时间。
  • 谢谢!计划将我的插入包装在一个函数中,如果其他所有方法都失败了,就这样做。只是想确保在我尝试之前有一种更有效的方法。

标签: html node.js mongodb websocket


【解决方案1】:

将我的评论变成答案,因为它似乎是您正在寻找的。​​p>

您认为“混乱”的做法才是正确的做法。嵌套它。如果你真的想,你可以把插入放在一个单独的函数中,然后从区间内调用它。异步计时仅在异步回调中有效,因此您可以在其中进行工作。您可以将数据放入更高范围的数组中并将其存储在那里,但仅在 setInterval() 回调中知道刚刚将值添加到数组中的时间。

【讨论】:

  • 这可能听起来很愚蠢,但如果我不需要知道何时将值传递给数组。如何将数据传递到更高范围的数组,以便我的应用程序的其他部分可以使用这些生成的值?
  • @Jambo - 您可以.push() 数据或以其他方式将其分配给更高范围的变量,它将在更高的范围内。你只是不知道什么时候可以在更高的范围内使用它,除非你还有某种通知系统:回调、eventEmitter、promise 等……通常,当 node.js 的新手尝试这样做时,他们正在犯编程错误,因为他们不了解异步时序。
  • 所以一直在搞乱承诺、回调和函数,以尝试获得我想要的结果并且惨遭失败(如果这个问题不应该在这里,请告诉我)。目前我的单个节点脚本正在为用户提供网页,然后使用 websocket 并设置间隔每秒推送数据,我应该将它分成两个脚本吗?一个从 websocket 服务器接收数据,然后每 1 分钟和 5 分钟将其插入到我的 mongoDB 中的一种?或者我应该用我的html页面在客户端处理它?我对异步编程很抱歉
猜你喜欢
  • 1970-01-01
  • 2011-10-23
  • 1970-01-01
  • 2018-08-18
  • 2019-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多