2011-10-10 4 views
1

J'essaie d'utiliser WebSockets pour la première fois et je crée une application de liste de tâches. J'utilise Express et Socket.io et Redis.Comment utiliser les variables dans les rappels de niveau inférieur?

Dans le code suivant, socket.emit ('items', {items: redisItems}) échoue, indiquant que emit ne peut pas être effectué sur undefined. Je sais que client.hgetall est un appel asynchrone et que je dois le faire pour exécuter l'after. Comment je le répare? Dois-je utiliser quelque chose comme Futures ou peut-il être fait avec une petite correction sur ce que j'ai en ce moment?

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); 
    }); 
}); 

Sidenote: Ce que j'ai actuellement va comme ceci: 1) navigateur demande page 2) Une fois que le navigateur a la page, il se connecte par WebSocket et demande les éléments TODO (donc 2 demandes). Dans le futur, je préférerais quelque chose comme 1) le navigateur fait une requête pour la page 2) le serveur donne la page et envoie les éléments une fois que c'est fait.

Répondre

1

Vous écrasez votre objet socket dans le rappel getItems. Alors que l'événement de connexion io.sockets initial renvoie le socket, les événements socket.on suivants ne renvoient pas d'autre objet socket, ils renvoient des données pour l'événement. Essayez quelque chose comme:

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); 
    }); 
}); 
Questions connexes