socket.io - 从匿名函数

时间:2015-07-01 17:08:46

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

我对异步的世界很新。在使用任何库之前,我首先尝试使用回调执行所有操作。我想我有一个关闭问题,但不知道该怎么办。

以下是一些代码:

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语句来调用回调,但这可能是另一天的讨论。

1 个答案:

答案 0 :(得分:0)

这是一个关闭问题!只是不是我所期待的。

我也是,嗯,不太懂。

回调不是问题,在redis响应函数中可以访问变量。我原以为在parent / ancestor函数中声明的任何变量都可用于children / decedent函数。

在这个例子中,我需要在循环中创建一个函数,并显式传递变量,使其在闭包内可用。

这是stackoverflow问题,它指出了我正确的方向:

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