如何在低级别的callback中使用variables?

我正在尝试第一次使用WebSockets,并且正在制作待办事项列表应用程序。 我正在使用Express和Socket.io和Redis。

在下面的代码中,socket.emit('items',{items:redisItems})失败,说不能在undefined上进行发射。 我知道client.hgetall是一个asynchronous调用,我不得不以某种方式得到它执行后。 我如何解决它? 我是否使用“期货”之类的东西,或者可以通过对我现在所拥有的东西进行一些小的修改来完成?

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连接,并要求待办事项(所以2请求)。 在将来,我更喜欢像1)浏览器请求页面2)服务器给页面和发送项目一旦完成。

你在getItemscallback中覆盖你的套接字对象。 当初始的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); }); });