2012-12-16 2 views
0

flapjax를 사용하여 작은 chatservice를 구현하려고합니다. 나는 eventStream을 사용하여 서버에 연결하는 모든 클라이언트를 가져오고, 메시지 ('message'의 함수)를 브로드 캐스팅 할 때이 이벤트 스트림을 현재 클라이언트에 메시지를 보내는 함수로 매핑합니다.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]);}); 

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) { 

    }); 
}); 

eventstream에 대한 고객의 registring이 코드에 성공하지만, MAPE이 모든 클라이언트에 걸쳐 루프가 발생하지 않습니다. 아무도 여기서 무엇이 잘못되었는지를 압니까?

답변

0

여전히 추측 할 수 없다면 mapE은 동작 자체를 생성하지 않기 때문에 mapE는 주어진 소스처럼 작동하지만 지정된 함수를 사용하여 수정 된 값을 갖는 다른 EventStream 만 생성하고 반환하기 때문이라고 생각합니다.

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 이벤트 코드와 분리되어 있으며 이들 사이에 공유 상태가 없습니다.

관련 문제