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

Javascript 如何在事件上使用RxJs和Socket.IO,javascript,sockets,rxjs,Javascript,Sockets,Rxjs,我想在我的socket.on('sense',function(data){})中使用RxJS。我被可用的文档太少和对RxJS的理解不足所困扰。这是我的问题 我有一个具有函数pingEnd()的distSensor.js 在我的App.js中,我有 io.on('connection', function (socket) { socket.on('sense', function (data) { //console.log('sense from App4 was c

我想在我的
socket.on('sense',function(data){})中使用RxJS。我被可用的文档太少和对RxJS的理解不足所困扰。这是我的问题

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

在我的App.js中,我有

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

sense函数获取大量的传感器数据,我想用RxJS对这些数据进行过滤,我不知道在这里使用RxJS接下来应该做什么。任何指向正确文档或示例的指针都会有所帮助

您可以创建一个可观察的对象,如下所示:

var senses=Rx.Observable.fromEventPattern(
功能添加(h){
插座。on('sense',h);
}
);

然后像任何其他可观察的对象一样使用
感官。

您可以使用
Rx.Observable.fromEvent
()

下面是我如何使用Bacon.js做类似的事情,它有一个非常相似的API:

所以在Bacon.js中

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

在RxJs中,您将用
Rx.Observable.fromEvent
替换
Bacon.fromEvent
,我使用fromEvent方法遇到了一些奇怪的问题,因此我更愿意创建自己的Observable:

function RxfromIO (io, eventName) {
  return Rx.Observable.create(observer => {
    io.on(eventName, (data) => {
        observer.onNext(data)
    });
    return {
        dispose : io.close
    }
});
然后我可以这样使用:

let $connection = RxfromIO(io, 'connection');
您可以使用rxjs dom

Rx.DOM.fromWebSocket(url, protocol, [openObserver], [closeObserver])


// an observer for when the socket is open
var openObserver = Rx.Observer.create(function(e) {
  console.info('socket open');

  // Now it is safe to send a message
  socket.onNext('test');
});

// an observer for when the socket is about to close
var closingObserver = Rx.Observer.create(function() {
  console.log('socket is about to close');
});

// create a web socket subject
socket = Rx.DOM.fromWebSocket(
  'ws://echo.websocket.org',
  null, // no protocol
  openObserver,
  closingObserver);

// subscribing creates the underlying socket and will emit a stream of incoming
// message events
socket.subscribe(
  function(e) {
    console.log('message: %s', e.data);
  },
  function(e) {
    // errors and "unclean" closes land here
    console.error('error: %s', e);
  },
  function() {
    // the socket has been closed
    console.info('socket closed');
  }
);

ES6我使用的一行程序,使用语法:
(将
$
读作

只需使用
fromEvent()
。下面是Node.js中的完整示例,但在浏览器中也适用。请注意,我使用
first()
takeUntil()
来防止内存泄漏:
first()
只侦听一个事件,然后完成。现在对您侦听的所有其他套接字事件使用
takeUntil()

const app = require('express')();
const server = require('http').createServer(app);
const io = require('socket.io')(server);
const Rx = require('rxjs/Rx');

connection$ = Rx.Observable.fromEvent(io, 'connection');

connection$.subscribe(socket => {
    console.log(`Client connected`);

    // Observables
    const disconnect$ = Rx.Observable.fromEvent(socket, 'disconnect').first();
    const message$ = Rx.Observable.fromEvent(socket, 'message').takeUntil(disconnect$);

    // Subscriptions
    message$.subscribe(data => {
        console.log(`Got message from client with data: ${data}`);
        io.emit('message', data); // Emit to all clients
    });

    disconnect$.subscribe(() => {
        console.log(`Client disconnected`);
    })
});

server.listen(3000);

add(h)方法的功能是什么?这个函数是RxJs的一部分吗?我只是给函数命名,你只要:
function(h){…}
。fromEvent对我不起作用。我最终得到了这个解决方案。在TS its中:
let obs=Observable.fromEventPattern(h=>this.socket.on('my_event',h))只需使用fromEvent,无需编写此额外代码
const sense$=Rx.Observable.fromEvent(套接字,'sense')似乎Rx.DOM.fromWebSocket无法与socket.io-server一起使用。fromWebSocket使用w3c标准websocket API。请删除“我认为”,因为它工作正常。也可以用你已经描述过的
Rx.Observable
替换Bacon。只需使用fromEvent即可,无需编写额外的代码!const connection$=Rx.Observable.fromEvent(io,“connection”);嗨,伙计!你遇到了什么样的问题?你好@Mick,很好的样本,但是客户端呢?当通过fromEvent observable调用unsubscribe时,我正在努力解决如何断开连接的问题。
import { Observable } from 'rxjs'

// create socket

const message$ = Observable.create($ => socket.on('message', ::$.next))
// translates to: Observable.create($ => socket.on('message', $.next.bind(this)))

// filter example
const subscription = message$
  .filter(message => message.text !== 'spam')
  //or .filter(({ text }) => text !== 'spam')
  .subscribe(::console.log)
const app = require('express')();
const server = require('http').createServer(app);
const io = require('socket.io')(server);
const Rx = require('rxjs/Rx');

connection$ = Rx.Observable.fromEvent(io, 'connection');

connection$.subscribe(socket => {
    console.log(`Client connected`);

    // Observables
    const disconnect$ = Rx.Observable.fromEvent(socket, 'disconnect').first();
    const message$ = Rx.Observable.fromEvent(socket, 'message').takeUntil(disconnect$);

    // Subscriptions
    message$.subscribe(data => {
        console.log(`Got message from client with data: ${data}`);
        io.emit('message', data); // Emit to all clients
    });

    disconnect$.subscribe(() => {
        console.log(`Client disconnected`);
    })
});

server.listen(3000);