2016-10-21 2 views
1

J'ai besoin d'aide avec Socket.IO et bacon.JS:Comment recevoir les paramètres envoyés depuis un événement socket.io en utilisant baconJS?

J'ai sur le côté client d'un événement qui envoie émette socket.IO 2 paramètres au serveur, comme indiqué ci-dessous:

$("#btn").asEventStream("click").onValue(function(){ 
    socket.emit("event", param1, param2); 
}); 

Ensuite, du côté serveur, j'ai besoin de recevoir ces 2 paramètres pour pouvoir faire des choses avec eux.

Suivant l'exemple sur this answer, j'ai essayé de faire quelque chose comme ceci:

io.on('connection', function (socket) { 
     socket.on('error', function (err) { 
      console.log(err); 
     }); 

     Bacon.fromEvent(socket, "event", param1, param2) 
      .filter(function(param1, param2){ return true }) 
      .forEach(function(param1, param2){ 
       doStuff(param1, param2); 
      }); 
    }); 

Mais cela n'a pas fonctionné. Pour résumer, j'ai besoin de recevoir l'événement sur le serveur en tant que flux d'événements et d'utiliser les paramètres.

Quelqu'un peut-il m'aider?

Répondre

2

Je l'ai résolu!

Il s'avère que vous envoyez objets en utilisant le combo bacon.js + socket.io. Lorsque vous émettez un événement socket.io avec un objet comme paramètre, vous pouvez capturer cet événement dans un flux d'événements, et chaque événement de ce flux sera en fait l'objet que vous avez envoyé en tant que paramètre.

Alors ce que je faisais était:

//client side 
$("#btn").asEventStream("click").onValue(function(){ 
    var obj = {p1: param1, p2: 'param2'}; 
    socket.emit("someEvent", obj); 
}); 

//server side 
Bacon.fromEvent(socket, "someEvent") 
    .onValue(function(data){ 
     doStuff(data.p1, data.p2); 
    }); 

Ou vous pouvez aussi faire quelque chose avec l'objet et émettre un événement prise en arrière avec le résultat, comme ceci:

//server side 

//doStuff can return anything, it doesn't have to be an object 
function doStuff(data){if data.p2 === 'param2' {return true}}; 

Bacon.fromEvent(socket, "someEvent") 
    .map(function (data) { return doStuff(data) }) 
    .onValue(socket, "emit", "returnEvent"); 

et vous pouvez capturer l'événement de retour du côté client, et chaque événement sur cet EventStream résultant sera le retour de la fonction "doStuff":

//client side 
Bacon.fromEvent(socket, "returnEvent") 
    .onValue(function(data){ 
     console.log(data); 
    });