【问题标题】:socket.io - emitting from within an anonymous functionsocket.io - 从匿名函数中发出
【发布时间】:2015-09-18 23:33:24
【问题描述】:

我对异步世界很陌生。在使用那里的任何库之前,我首先尝试使用回调来做所有事情。我想我有一个关闭问题,但不知道该怎么办。

这里有一些代码:

namespace.on('connection', function(socket){
    var newClient = socket.id//just in case the a new user logged on between declaration and use
    socket.join('room1')
    function newConnection(positionCallback, hashCallback, newUser){
        namespace.to(socket.id).emit('hello', {yo:'works'})
        for(var i=0; i< cardCounter ;i++){
            var keyVal = 'card:'+ cardArray[i]
            redis.hgetall(keyVal, function (err, storedMsg) {
                    namespace.to(socket.id).emit('hello', {yo:'doesnt work'})
                    hashCallback(storedMsg, newUser)
                });
            if(i==cardCounter-1){
                positionCallback()
            }
        }
    }

    function onConnectionComplete(){
        namespace.to(socket.id).emit('hello', {yo:'works'})
    }

    function onHashComplete(hashObject, newUser){
        namespace.to(newUser).emit('hello', {yo:'doesnt work'})
    }

    newConnection(onConnectionComplete, onHashComplete, newClient)
}

我已经在这个地方放置了一些 socketio 发射,以查明哪里出了问题。

任何在 redis 调用之外的发射都按预期工作。一旦我进入那个匿名函数 - nada。

也就是说,我已经在该函数中添加了 console.log() 的所有内容。我从 redis 中得到了正确的结果,我有正确的用户,并且定义了命名空间。

我就是无法发出结果。

我会认为匿名函数可以访问它之外的范围 - 但不是相反。我看不出有什么不能通过...

另外我知道有些人不喜欢 if 语句来调用回调,但这可能是另一天的讨论。

【问题讨论】:

    标签: javascript node.js asynchronous redis socket.io


    【解决方案1】:

    这是一个关闭问题!只是出乎我的意料。

    我也,咳咳,不太明白。

    回调不是问题,在 redis 响应函数中获取变量是可访问的。我会认为在父/祖先函数中声明的任何变量都可用于子/后代函数。

    在这种情况下,我需要在循环内创建一个函数,并显式传递变量以使其在闭包内可用。

    这是给我指明正确方向的 stackoverflow 问题:

    How can I access the key passed to hgetall when using node_redis?

    【讨论】:

      猜你喜欢
      • 2013-01-29
      • 1970-01-01
      • 2013-07-25
      • 2021-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-08
      相关资源
      最近更新 更多