2012-12-16 38 views
0

我正在嘗試使用flapjax實現一個小型chatservice。我使用eventStream來獲取連接到服務器的所有客戶端,並且在廣播消息('消息'上的函數)時,我將此eventStream映射到將消息發送到當前客戶端的函數。flapjax從事件流中獲取最後一個元素

// Event stream yielding received clients 
var clientReceiverE = receiverE(); 
// Event stream collecting all the clients 
var clientsE = clientReceiverE.collectE([], function (client, clients) {return clients.concat([client]);}); 

socket.on('connection', function(client) { 
    clientReceiverE.sendEvent(client); 
    for (i = 0; i < chatMessages.length; i++) { 
     client.emit('message', chatMessages[i]); 
    } 

    client.on('message', function(message) { 
     chatMessages.push(message); 
     //for (i = 0; i < clients.length; i++) { 
     // clients[i].emit('message', message); 
     //} 
     mapE(clientReceiverE, function(client) {console.log(client); client.emit('message', message); return client}); 
    }); 

    client.on('nickname', function(name) { 

    }); 
}); 

客戶對eventstream的成功在註冊使用此代碼,但梅普不會導致一個循環對所有這客戶。有人知道這裏有什麼問題嗎?

回答

0

如果你仍然沒有猜到:)我認爲這是因爲mapE本身並不產生任何動作,mapE只創建並返回另一個行爲與給定源相似的EventStream,但通過給定函數修改值。

0

你不應該使用這樣的mapE。在你的代碼中,你試圖重新創建每個client.on('message',...)的mapE事件綁定。

這個問題是使用receiverE解決的。該函數用於將外部事件流轉換爲flapjax EventStream。

// Event stream yielding received clients 
var clientReceiverE = receiverE(); 
// Event stream collecting all the clients 
var clientsE = clientReceiverE.collectE([], function (client, clients) {return clients.concat([client]);}); 
var clientsB = clientsE.startsWith(undefined); //Turn the event stream into a behaviour (event + value) 

var messagesE = receiverE(); 
messagesE.mapE(function(messagePacket){ 
    var clients = clientsB.valueNow();  //Grab current value of client list behaviour 
    if(clients==undefined){ 
     return; 
    } 
    var from = messagePacket.client; 
    for(var index in clients){ 
     clients[index].emit('message', messagePacket.message); 
     console.log(messagePacket.message); 
    } 
}); 

socket.on('connection', function(client) { 
    clientReceiverE.sendEvent(client); 

    client.on('message', function(message) { 
     messagesE.sendEvent({client: client, message: message}); 
    }); 
}); 

區別在於此。 flapjax樹與WebSocket事件代碼隔離,它們之間沒有共享狀態。

相關問題