2016-12-22 8 views
1

RxJsとWebSocketを使用して、私はサーバからデータを受信し、私のプログラムのサービスの購読者に送ると思われるいくつかのサービスを作成しました。サービスが1つしかなかった場合は問題はありませんでしたが、2つ目のサービスを作成した後、最初のサービスは応答をもう受信しません。どうすればそれが確実になるのですか?1人のサブスクライバだけがサーバからの応答を受け取ります

import { Injectable } from '@angular/core'; 
import * as Rx from 'rxjs/Rx'; 

@Injectable() 
export class WebSocketService { 
private subject: Rx.Subject<MessageEvent>; 

public connect(url): Rx.Subject<MessageEvent> { 
    if (!this.subject) { 
     this.subject = this.create(url); 
    } 
    return this.subject; 
} 

private create(url): Rx.Subject<MessageEvent> { 
    let ws = new WebSocket(url); 

    let observable = Rx.Observable.create(
     (obs: Rx.Observer<MessageEvent>) => { 
      ws.onmessage = obs.next.bind(obs); 
      ws.onerror = obs.error.bind(obs); 
      ws.onclose = obs.complete.bind(obs); 

      return ws.close.bind(ws); 
     }) 

    let observer = { 
     next: (data: Object) => { 
      if (ws.readyState === WebSocket.OPEN) { 
       ws.send(JSON.stringify(data)); 
      } 
     } 
    } 

    return Rx.Subject.create(observer, observable); 
} 
} 

そして、この私のカウントダウンサービス:他のサービスはカウントダウンサービスとしてではなく、他の変数と同じように実装されている

import { Injectable } from '@angular/core'; 
import { Observable, Subject } from 'rxjs/Rx'; 
import {WebSocketService } from './websocket.service'; 

const AUCTION_URL = 'ws://localhost:9999'; 

export interface Countdown { 
days: number, 
hours: number, 
minutes: number, 
seconds: number 
} 

@Injectable() 
export class CountdownService { 
public countdowns: Subject<Countdown>; 

constructor(wsService: WebSocketService) { 
    this.countdowns = <Subject<Countdown>>wsService 
     .connect(AUCTION_URL) 
     .map((response: MessageEvent): Countdown => { 
      let data = JSON.parse(response.data); 
      return { 
       days: data.days, 
       hours: data.hours, 
       minutes: data.minutes, 
       seconds: data.seconds 
      } 
     }); 
} 
} 

は、ここに私のWebSocketサービスです。

ご協力いただきありがとうございます。

答えて

1

サービスは複数のコンポーネントで使用されていますか?私はサービスが一度だけインスタンス化されていることを確認します。

また、観察に共有演算子を追加することによって作成することを確認することができます。ご返信用

let observable = Rx.Observable.create(
     (obs: Rx.Observer<MessageEvent>) => { 
      ws.onmessage = obs.next.bind(obs); 
      ws.onerror = obs.error.bind(obs); 
      ws.onclose = obs.complete.bind(obs); 

      return ws.close.bind(ws); 
     }).share() 
+0

感謝を。 (SystemJS)wsServiceが定義されていません(...) – Jesper

+0

this.wsServiceを使用する必要があります – bendyourtaxes

+0

このエラーが発生しました: (SystemJS)未定義のプロパティ 'connect'を読み取ることができません。 (···) – Jesper

関連する問題