Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Angular和rxjs中重新连接websocket?_Angular_Typescript_Websocket_Rxjs_Ngrx - Fatal编程技术网

在Angular和rxjs中重新连接websocket?

在Angular和rxjs中重新连接websocket?,angular,typescript,websocket,rxjs,ngrx,Angular,Typescript,Websocket,Rxjs,Ngrx,我有一个基于ngrx/store v2.2.2和rxjs v5.1.0的应用程序,该应用程序使用可观察到的数据监听web套接字以获取传入数据。当我启动应用程序时,我完美地接收到传入的数据 然而,过了一段时间,更新很少出现,连接似乎丢失了,我再也没有收到任何传入数据。我的代码: 服务 订户 当web套接字超时时,我需要做什么来重新连接它,以便observable继续发出传入值 我看了一些问答,它似乎没有以我能理解的方式解决这个问题 注意:websocket位于wss://notessensei.m

我有一个基于ngrx/store v2.2.2和rxjs v5.1.0的应用程序,该应用程序使用可观察到的数据监听web套接字以获取传入数据。当我启动应用程序时,我完美地接收到传入的数据

然而,过了一段时间,更新很少出现,连接似乎丢失了,我再也没有收到任何传入数据。我的代码:

服务 订户 当web套接字超时时,我需要做什么来重新连接它,以便observable继续发出传入值

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

注意:websocket位于wss://notessensei.mybluemix.net/ws/time 是实时的,每分钟会发出一次时间戳,以备测试

非常感谢您的建议

这可能不是一个好答案,但评论起来太多了

问题可能来自您的服务:

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

如果BehaviorSubject在您订阅之前接收到事件,它将发送最后一个值。另外,由于它是一个主题,因此不需要使用共享操作符。

实际上,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(...)
有关更多信息,请参阅文档。不幸的是,searchbox没有显示该方法,但您可以在此处找到它:

那个-导航在我的浏览器中不起作用,所以在那个页面上搜索webSocket


来源:

对于rxjs 6,websocket实现

import { webSocket } from 'rxjs/websocket';
let subject = webSocket('ws://localhost:8081');

如果流中存在错误,则应在.subscribe的错误参数中提取该错误。你所有的努力。。。catch所做的是提取流实际接收某些数据的块中产生的任何错误。因此,添加错误处理程序至少是一个很好的起点,因为它将显示是否确实存在终止错误。注意,由于您是在observable中手工包装Websocket,因此:还应该有一个this.Websocket.onerror映射到observer.error,以便在subscription.Thx中获取提示。我将重做我的示例,看看我是否能掌握它。断开连接不是错误,而是套接字的事件,因此它可能不会冒泡到Observices是单例的,因此ngOnInit应该只运行一次。但我会查一查的,我知道服务是单件的。抱歉,我说得不够清楚,但我刚才说的是您组件中的ngOnInit,它调用您的服务方法listenToTheSocketAh。知道了。非常感谢你的建议。应用程序组件位于组件树的根。应该只运行一次,但值得指出和检查。如何导入此项?要在rxjs 6中导入此项,请使用“rxjs/webSocket”中的导入{webSocket}。此方法对我不起作用。我必须使用新的WebSocketSubject'ws://localhost:8081'构造器,然后在下一个构造器中我必须发送subject.next{event:'myEvent',data:'hello'}文档在多个地方明确地说,以确保使用JSON.stringify序列化对象,但我无法让它工作。培根拯救了这个答案:
 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(...)
import { webSocket } from 'rxjs/websocket';
let subject = webSocket('ws://localhost:8081');