我第一次尝试使用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)服务器提供页面并在完成后发送项目。
答案 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);
});
});