angular - 在 Angular 和 rxjs 中重新连接 websocket?

标签 angular typescript websocket rxjs ngrx

我有一个基于 ngrx/store (v2.2.2) 和 rxjs (v5.1.0) 的应用程序,它使用 observable 监听网络套接字以获取传入数据。当我启动应用程序时,我会完美地接收传入数据。

但是过了一段时间(更新很少出现)连接似乎断开了,我再也收不到传入数据了。我的代码:

服务

import { Injectable, OnInit } from '@angular/core';
import { Observable } from 'rxjs';

@Injectable()
export class MemberService implements OnInit {

  private websocket: any;
  private destination: string = "wss://notessensei.mybluemix.net/ws/time";

  constructor() { }

  ngOnInit() { }

  listenToTheSocket(): Observable<any> {

    this.websocket = new WebSocket(this.destination);

    this.websocket.onopen = () => {
      console.log("WebService Connected to " + this.destination);
    }

    return Observable.create(observer => {
      this.websocket.onmessage = (evt) => {
        observer.next(evt);
      };
    })
      .map(res => res.data)
      .share();
  }
}

订户

  export class AppComponent implements OnInit {

  constructor(/*private store: Store<fromRoot.State>,*/ private memberService: MemberService) {}

  ngOnInit() {
    this.memberService.listenToTheSocket().subscribe((result: any) => {
      try {
        console.log(result);
        // const member: any = JSON.parse(result);
        // this.store.dispatch(new MemberActions.AddMember(member));
      } catch (ex) {
        console.log(JSON.stringify(ex));
      }
    })
  }
}

我需要做什么才能在超时时重新连接网络套接字,以便 Observable 继续发出传入值?

我看了一些问答 here , herehere它似乎没有解决这个问题(以我能理解的方式)。

注意:位于 wss://notessensei.mybluemix.net/ws/time 的 websocket 是实时的,并且每分钟发出一次时间戳(以防有人想要测试它)。

非常感谢您的建议!

最佳答案

实际上现在在 rxjs 中有一个 WebsocketSubject!

 import { webSocket } from 'rxjs/webSocket' // for RxJS 6, for v5 use Observable.webSocket

 let subject = webSocket('ws://localhost:8081');
 subject.subscribe(
    (msg) => console.log('message received: ' + msg),
    (err) => console.log(err),
    () => console.log('complete')
  );
 subject.next(JSON.stringify({ op: 'hello' }));

当您重新订阅断开的连接时,它会处理重新连接。所以例如写这个重新连接:

subject.retry().subscribe(...)

有关更多信息,请参阅文档。不幸的是,搜索框没有显示该方法,但您可以在这里找到它:

http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-webSocket

#-navigation 在我的浏览器中不起作用,因此在该页面上搜索“webSocket”。

来源:http://reactivex.io/rxjs/file/es6/observable/dom/WebSocketSubject.js.html#lineNumber15

关于angular - 在 Angular 和 rxjs 中重新连接 websocket?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44060315/

相关文章:

javascript - 使用对象数组动态生成新数组

arrays - Typescript:如何访问数组对象的元素?

html - 如何在没有 webSockets 的情况下使用 QT WebChannel

websockets.exceptions.ConnectionClosed : WebSocket connection is closed: code = 4008 (private use), 原因 = 速率限制

javascript - 异步需要 AsyncTestZoneSpec - Angular

css - 为什么 angular 2 组件会影响它托管的实际 html 的样式?

javascript - 如何在 Angular 中保存和加载 html WYSIWYG 编辑器中的内容

typescript - 为什么 Typescript 允许我这样做?不检查数组的长度

javascript - 使用 mocha 进行测试时导入 firebase-functions-test 时出错

javascript - 使用存储为字符串的数字