Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在低级回调中使用变量?_Javascript_Node.js - Fatal编程技术网

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

Javascript 如何在低级回调中使用变量?,javascript,node.js,Javascript,Node.js,我第一次尝试使用WebSocket,我正在制作一个待办事项列表应用程序。我正在使用Express、Socket.io和Redis 在下面的代码中,socket.emit('items',{items:redisItems})失败,表示无法对未定义的对象执行emit。我知道client.hgetall是一个异步调用,我必须以某种方式让它在之后执行。我怎么修理它?我是用期货之类的东西,还是可以在我现在拥有的东西上稍加修改 io.sockets.on('connection', function (s

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

在下面的代码中,socket.emit('items',{items:redisItems})失败,表示无法对未定义的对象执行emit。我知道client.hgetall是一个异步调用,我必须以某种方式让它在之后执行。我怎么修理它?我是用期货之类的东西,还是可以在我现在拥有的东西上稍加修改

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连接并请求todo项目(因此2个请求)。
在将来,我更喜欢1)浏览器请求页面2)服务器提供页面并在完成后发送项目。

您正在覆盖
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);
  });
});

您正在覆盖
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);
  });
});