如何使用baconJS接收socket.io emit事件发送的参数?

时间:2016-10-21 22:42:07

标签: javascript node.js websocket socket.io bacon.js

我需要一些socket.io和bacon.JS的帮助:

我在客户端有一个socket.IO emit事件,它向服务器发送2个参数,如下所示:

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

然后在服务器端我需要接收这两个参数,以便我可以用它们做些什么。

按照this answer上的示例,我尝试了这样的事情:

    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);
            });
    });

但它没有用。

总结一下,我需要在服务器上接收事件作为EventStream,并使用参数。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

我解决了!

原来你使用bacon.js + socket.io组合发送对象

当您以对象作为参数发出socket.io事件时,您可以在事件流中捕获此事件,该流上的每个事件实际上都是您作为参数发送的对象。

所以我做的是:

//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);
    });

或者您也可以对该对象执行某些操作并使用结果发回一个套接字事件,如下所示:

//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");

然后你可以捕获客户端返回的事件,这个结果EventStream上的每个事件都将返回“doStuff”函数:

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