0

私は、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) {

    });
});

イベント ストリーム上のクライアントの登録文字列はこのコードで成功しますが、mapE はこのすべてのクライアントでループを引き起こしません。ここで何が悪いのか誰か知っていますか?

4

2 に答える 2

0

まだ推測されていない場合:) mapE 自体はアクションを生成しないためだと思います。mapE は、指定されたソースのように動作する別の EventStream を作成して返すだけですが、指定された関数によって値が変更されます。

于 2013-10-17T12:55:39.270 に答える
0

そのように mapE を使用するべきではありません。コードでは、各 client.on('message', ...) で mapE イベント バインディングを再作成しようとしています。

この問題は、レシーバーE を使用して解決されます。この関数は、外部イベント ストリームを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 イベント コードから分離されており、それらの間で状態が共有されることはありません。

于 2013-11-12T00:27:30.823 に答える