0

我正在尝试使用 flapjax 实现一个小型聊天服务。我使用 eventStream 来获取连接到服务器的所有客户端,并且在广播消息时('message' 上的函数),我使用将消息发送到当前客户端的函数映射到此 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) {

    });
});

使用此代码在事件流上注册客户端成功,但 mapE 不会导致所有这些客户端的循环。有人知道这里有什么问题吗?

4

2 回答 2

0

你不应该那样使用 mapE 。在您的代码中,您尝试使用每个 client.on('message', ...) 重新创建 mapE 事件绑定。

这个问题使用receiverE来解决。此函数用于将外部事件流转换为flajax 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});
    });
});

不同的是这个。flajax 树与 WebSocket 事件代码隔离,它们之间没有共享状态。

于 2013-11-12T00:27:30.823 回答
0

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

于 2013-10-17T12:55:39.270 回答