2017-11-27 2 views
1

현재 각도 4 (rxjs-websockets) 사용자 (https://github.com/ohjames/rxjs-websockets)를 사용하려고합니다. 여기 각도 4의 rxjs-websockets에서 재 연결 처리

내 서비스 :

import { Injectable } from '@angular/core'; 
import { QueueingSubject } from 'queueing-subject' 
import { Observable } from 'rxjs/Observable' 
import websocketConnect from 'rxjs-websockets' 
import { environment } from 'environments/environment'; 

@Injectable() 
export class WebsocketJWTService { 
    private inputStream: QueueingSubject <any> 
    public messages: Observable <any> 
    SERVER: string = environment["SERVER_ADDRESS"]; 
    constructor(private modal: Modal, private SS: SharedService, private userManager: UserManagerService) {} 
    public connect() { 
     let SERVER = this.SERVER.substring(8); 
     if (this.messages) 
      return; 
     let temp = websocketConnect(
      "wss://" + SERVER + "/ws/media?token=" + this.userManager.getToken(), 
      this.inputStream = new QueueingSubject <any>() 
     ) 
     this.messages = temp.messages.share() 
    } 
    public send(message: any): void { 
     message['WSTOKEN'] = this.userManager.getToken(); 
     this.inputStream.next(message) 
    } 
} 

및 내 구성 요소에 이런 식으로 전화 해요 : 내가 연결 상태를 볼 수 있도록 재 연결을 처리하기 위해 노력하고있어 지금

constructor(private socket:WebsocketJWTService) {} 
ngOnInit() { 
    this.socket.connect(); 
    this.socketSubscription = this.socket.messages.subscribe(message => this.socketMessage(message)); 
} 

을 연결된 소켓 수가 0이되면 연결 기능을 다시 호출하십시오.

temp.connectionStatus.subscribe(numberConnected => { 
    if (this.connectedNumber > numberConnected) { 
     console.log("disconnected"); 
     setTimeout(() => { 
      delete this.messages; 
      this.connect(); 
      this.messages.subscribe(); 
     }, 5000) 
    } 
    this.connectedNumber = numberConnected; 
}) 

정상적으로 작동합니다. 내 소켓이 떨어졌을 때 다시 연결되는 것을보고 있지만 재 연결 후 내 가입이 작동을 멈춘다. 새 소켓 연결에서 보낸 소켓 이벤트가 표시되지만 각도 코드가 알림되지 않는 것 같습니다.

누군가가 websocket에 다시 연결하고 구독을 유지하는 방법을 알고 있습니까?

는 시간

답변

0

link you pasted 섹션 "실패에 다시 연결"을 가지고 주셔서 감사합니다. 그렇게 읽었습니까? 그것이 당신이 그것을하는 방식이고 작동하기 때문입니다.

어떻게하면 rxjs이 작동하지 않으므로 사용자 자신의 시도가 작동하지 않습니다. subscribe()은 새 구독을 반환하고 다시 구독 코드에서 해당 구독으로 아무 것도하지 않습니다. 이전 가입은 이전 가입입니다. 실패하면 더 이상 사용할 수 없습니다.

기본 프라이머는 rxjs으로 시작하고 직접 사용하기 전에 덥고 차가운 관찰 물에 대해 읽으십시오. 그렇지 않으면 사용중인 라이브러리의 README에 예제를 복사 할 수 있습니다.

(사이드 노트 : 나는 Library Author입니다.)

0

다음과 같이하십시오. count는 재 시도를 추적하는 단지 지역 변수입니다.

this.messages = temp.messages.share() 
          .retryWhen(attempts => { 
           return attempts 
           .do((error)=>{ 
            return 1}) 
            .mergeMap(error, count)=>{ 
             console.log(`Wait ${count} seconds, then reconnect!`); 
            return Observable.timer(count * 1000);}}