flapjax从eventstream获取最后一个元素

时间:2012-12-16 00:55:36

标签: node.js socket.io

我正在尝试使用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不会导致所有这些客户端的循环。有人知道这里有什么问题吗?

2 个答案:

答案 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事件代码隔离,它们之间没有共享状态。