繁体   English   中英

除非全局声明,否则无法从事件处理程序中的函数更新变量

[英]Cannot update variable from function within event handler unless its declared globally

我有一个nodejs后端应用程序,该应用程序使用猫鼬进行数据库连接和查询,在这种情况下,它们在socket.io的事件处理程序中执行,即io.on("connection", [callback])

但是,每当我在io.on("connection")的事件处理程序中运行查询时,例如socket.on("myEvent", [callback]) ,在更新后一个事件处理程序中的变量时都会遇到麻烦-特别是当其猫鼬查询的回调。

在某些情况下,以下是我尝试运行的示例:

io.on("connection", function(socket) {
  var myVar; // declare user within event handler scope
  socket.on("myEvent", function(m) {
    var query = m.myQuery;
    User.findOne({query}, function(err, doc) {
    if (err) {
      // error handling
    } else {
      myVar = doc;
      console.log(myVar); // logs whole document as it should
    }
  });

  socket.on("myOtherEvent", function(m){
    console.log(myVar); // undefined!?
  });
});

我还尝试过对自己的函数使用自定义的回调方法来解决此问题,该函数运行相同的查询并返回文档,因为我认为这可能是由于db查询异步引起的-但是,该方法也不起作用。

另外,我尝试在socket.on("myEvent)方法中使用var that = this方法(显然是臭名昭著) var that = this希望它可以引用原始回调。

我要么错过了猫鼬的全部要点,要么就疯了。 帮助将不胜感激!

编辑 :如前所述,一旦我全局声明myVar ,变量就会在所说的猫鼬查询的else块中更新。 然后,我也可以通过其他socket.on处理程序访问它。

我是否应该在socket.on("connection")块中声明我的变量,使其保持不变,例如,如果在声明myVar = "why isn\\'t this working?!"之后,我console.log(myVar) socket.on("myOtherEvent")它实际上记录了"why isn't this working?!" 到控制台

编辑2 :这里描述了一个非常类似的问题: 节点,猫鼬-无法访问查询回调中的父范围

使用myVar = myVar || {}的解决方案 myVar = myVar || {}无效。

编辑3 :按照建议,我对查询使用了Promises(在本例中为ES6),更新后的查询(仍在socket.on ,此处未显示)看起来像是基于该示例的以下示例:

User.findOne({query}).exec().then(function(doc) {
    if (!doc) {
        myVar = null; // unrelated
        logger.debug("Couldnt find user!"); // unrelated
    } else {
        myVar = doc;
        logger.debug(doc); // correctly prints the whole document
        logger.debug(user); // also correctly prints whole document
    }
}).catch(function(err){
    logger.error("Error searching for query: " + err);// unrelated
});

就目前而言,如果我以后再尝试访问myVar (在查询完成并将文档打印到控制台的else -block中)之后,它仍然会打印出我赋予它的初始值。 不管是null,布尔还是字符串-它都保持不变。

但是 :需要注意的有趣的事情是,我应该在全局范围内声明它,然后开始更新该变量-但是,然后它不是套接字所独有的,这就是为什么这种方法不适用于此特定问题的原因

最初由@Bergi解决-谢谢!

对于任何新手或不知道(如我所知)的人,套接字连接都无法合并:

与该问题特别相关的是Socket.io创建了多个实例/处理程序-具体来说,每个套接字一个。 这意味着具有多个套接字连接将使用所述事件处理程序创建多个实例,这也会导致这些变量的多个实例。

如果您出于某种原因想要(例如)具有特定于每个套接字连接的本地范围内的变量,这也可能非常有用。

谢谢!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM