Node.js flapjax从eventstream获取最后一个元素

Node.js flapjax从eventstream获取最后一个元素,node.js,socket.io,Node.js,Socket.io,我正在尝试使用flapjax实现一个小型聊天服务。我使用一个事件流来获取连接到服务器的所有客户端,当广播一条消息(“消息”上的函数)时,我使用将消息发送到当前客户端的函数映射到此事件流 // Event stream yielding received clients var clientReceiverE = receiverE(); // Event stream collecting all the clients var clientsE = clientReceiverE.collec

我正在尝试使用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) {

    });
});
//产生接收到的客户端的事件流
var clientReceiverE=接收方();
//收集所有客户端的事件流
var clientsE=clientReceiverE.collectE([],函数(客户机,客户机){return clients.concat([client]);});
socket.on('connection',函数(客户端){
clientReceiverE.sendEvent(客户端);
对于(i=0;i

使用此代码成功注册eventstream上的客户机,但mapE不会在所有这些客户机上产生循环。有人知道这里出了什么问题吗?

如果你还没有猜到:)我想这是因为mapE本身不产生任何动作,mapE只创建并返回另一个事件流,它的行为类似于给定的源,但通过给定的函数修改了值。

你不应该这样使用mapE。在代码中,您正试图与每个客户端重新创建mapE事件绑定。on('message',…)

这个问题是通过一个接收者解决的。此函数用于将外部事件流转换为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]);});
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事件代码隔离,它们之间没有共享状态