2011-10-10 90 views
1

我想第一次使用WebSockets,並且正在製作待辦事項列表應用程序。我正在使用Express和Socket.io和Redis。如何在較低級別的回調中使用變量?

在以下代碼中,socket.emit('items',{items:redisItems})失敗,表示無法對undefined進行發射。我知道client.hgetall是一個異步調用,我不得不以某種方式讓它執行後。我如何解決它?我是否使用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的,並要求對待辦事項(SO 2個請求)。在未來,我更喜歡像1)瀏覽器請求頁面2)服務器給頁面和發送項目一旦完成。

回答

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); 
    }); 
}); 
相關問題