如何在低级回调中使用变量?

时间:2011-10-10 03:31:56

标签: javascript node.js

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

在以下代码中,socket.emit('items',{items:redisItems})失败,表示无法在undefined上执行emit。我知道client.hgetall是一个异步调用,我必须以某种方式让它执行after。我如何解决它?我是否使用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连接并询问待办事项(所以2个请求)。 在将来,我更喜欢1)浏览器请求页面2)服务器提供页面并在完成后发送项目。

1 个答案:

答案 0 :(得分: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);
  });
});