我正在尝试使用flapjax实现一个小型聊天服务。我使用eventStream来获取连接到服务器的所有客户端,并且在广播消息时(“消息”上的函数),我使用向当前客户端发送消息的函数映射此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]);});
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) {
});
});
事件流上的客户端的registring成功使用此代码,但mapE不会导致所有这些客户端的循环。有人知道这里有什么问题吗?
答案 0 :(得分:0)
如果你还没猜到:)我认为这是因为mapE本身不产生任何动作,mapE只创建并返回另一个EventStream,它的行为类似于给定的源,但是通过给定的函数修改了值。 / p>
答案 1 :(得分: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事件代码隔离,它们之间没有共享状态。