2011-10-10 84 views
1

我想第一次使用WebSockets,并且正在制作待办事项列表应用程序。我正在使用Express和Socket.io和Redis。如何在较低级别的回调中使用变量?

在以下代码中,socket.emit('items',{items:redisItems})失败,表示无法对undefined进行发射。我知道client.hgetall是一个异步调用,我不得不以某种方式让它执行后。我如何解决它?我是否使用Futures这样的产品,或者可以通过对我现在的产品进行一些小修补来完成这项工作?

io.sockets.on('connection', function (socket) { 
    socket.on('getItems', function (socket){ 
    var redisItems = new Array; 
    callback = function(err,obj){ 
     for (att in obj) { 
     item = new Object(); 
     item.key = att; 
     item.done = obj[att]; 
     redisItems.push(item); 
     console.log(redisItems.length); 
     console.log(item.key); 
     } 
     socket.emit('items', {items: redisItems}) 
    }; 
    client.hgetall("items", callback); 
    }); 
}); 

旁注:我现在有是这样的:1)浏览器请求2页)一旦浏览器拥有的页面,它连接通过WebSocket的,并要求对待办事项(SO 2个请求)。在未来,我更喜欢像1)浏览器请求页面2)服务器给页面和发送项目一旦完成。

回答

1

您正在覆盖getItems回调中的套接字对象。虽然初始的io.sockets连接事件返回socket,但后续的socket.on事件不会返回另一个socket对象,它们会返回事件的数据。尝试类似:

io.sockets.on('connection', function (socket) { 
    socket.on('getItems', function (data){ 
    var redisItems = new Array; 
    callback = function(err,obj){ 
     for (att in obj) { 
     item = new Object(); 
     item.key = att; 
     item.done = obj[att]; 
     redisItems.push(item); 
     console.log(redisItems.length); 
     console.log(item.key); 
     } 
     socket.emit('items', {items: redisItems}) 
    }; 
    client.hgetall("items", callback); 
    }); 
}); 
相关问题