如何在事件中使用RxJs和Socket.IO

Mit*_*tul 16 javascript sockets rxjs

我想在我的内部使用RxJS socket.on('sense',function(data){});.我很困惑并且很少使用可用的文档和我对RxJS缺乏了解.这是我的问题.

我有一个distSensor.js函数pingEnd()

function pingEnd(x){
socket.emit("sense", dist); //pingEnd is fired when an Interrupt is generated.
}
Run Code Online (Sandbox Code Playgroud)

我的App.js里面有

io.on('connection', function (socket) {
    socket.on('sense', function (data) {
        //console.log('sense from App4 was called ' + data);
    });
});
Run Code Online (Sandbox Code Playgroud)

感知功能获取了大量我想用RxJS过滤的传感器数据,我不知道接下来我应该怎么做才能使用RxJs.任何指向正确文档或示例的指针都会有所帮助.

Mor*_*sen 18

我使用fromEvent方法遇到了一些奇怪的问题,所以我更喜欢创建自己的Observable:

function RxfromIO (io, eventName) {
  return Rx.Observable.create(observer => {
    io.on(eventName, (data) => {
        observer.onNext(data)
    });
    return {
        dispose : io.close
    }
});
Run Code Online (Sandbox Code Playgroud)

我可以这样使用:

let $connection = RxfromIO(io, 'connection');
Run Code Online (Sandbox Code Playgroud)

  • 喂伙计!您遇到过什么样的问题? (2认同)

rai*_*ska 17

我想你可以使用Rx.Observable.fromEvent(https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/fromevent.md).

以下是我使用Bacon.js做类似的事情,它有一个非常相似的API:https://github.com/raimohanska/bacon-minsk-2015/blob/gh-pages/server.js#L13

所以在Bacon.js中它会像

io.on('connection', function(socket){
  Bacon.fromEvent(socket, "sense")
    .filter(function(data) { return true })
    .forEach(function(data) { dealWith(data) })
})
Run Code Online (Sandbox Code Playgroud)

而在RxJs你替换Bacon.fromEventRx.Observable.fromEvent.

  • 请删除“我认为”,因为它可以正常工作。如您已经描述的那样,用“ Rx.Observable”替换培根。 (3认同)

Xes*_*ued 9

您可以像这样创建一个Observable:

var senses = Rx.Observable.fromEventPattern(
    function add (h) {
      socket.on('sense',h);
    }
  );
Run Code Online (Sandbox Code Playgroud)

然后senses像任何其他Observable一样使用.

  • 只需使用 fromEvent 无需编写此额外代码!`const sense$ = Rx.Observable.fromEvent(socket, 'sense');` (2认同)