2017-10-03 2 views
0

Ich versuche, eine Callback-Funktion in einer Serviceklasse zu implementieren, die Daten an die Komponentenklasse zurückgeben muss.Observable in einer Callback-Funktion - Winkel 2

ChatComponent.ts

export class ChatComponent implements OnInit { 

    constructor(public _chatService : ChatService) { 
    _chatService.joinChat() 
    } 

    OnInit(){ 

    } 

// I need to get the `msg` object from the ChatService class 
    didReceiveMessage(msg){ 
console.log(“Message received from chat service class”+msg); 
    } 

} 

ChatService.ts

import { Component, Input } from '@angular/core'; 
import { Injectable }  from '@angular/core'; 


@Injectable() 
export class ChatService { 
    public chatObj : SomeChatObject; 

    constructor() { } 

    joinChat(){ 
    //Join chat related functionality 
    this.chatObj.addHandler(this.onMessageReceivedHandler, null, "message"); 
    } 

    onMessageReceivedHandler = (message) => { 
    //Send `message` back to `didReceiveMessage ` method in ChatComponent.ts 
    return true; 
    } 
} 

Ich habe ein Beispiel für die Verwendung Http beobachtbare Rückruf gesehen. Hier habe ich meinen Callback explizit mit addHandler hinzugefügt. Ich werde das Nachrichtenobjekt in der Methode 'onMessageReceivedHandler' erhalten. Aber ich muss es ChatComponent übergeben. Wie kann ich die Daten weitergeben?

+0

machen eine return-Anweisung in der Callback-Methode abonnieren. – Jai

Antwort

1

Sie können einen Betreff dafür verwenden.

In ChatService:

subscribers: Subject[] = []; 

dann in joinChat

joinChat(userSubject: Subject) { 
    this.subscribers.push(userSubject); 
} 

dann in messageReceivedHandler:

for (let i = 0; i < this.subscribers.length(); i++) { 
    this.subscribers[i].next("Hello"); 
} 

ChatComponent:

constructor(public _chatService : ChatService) { 
    let subject = new Subject(); 
    subject.subscribe(
    msg => console.log(msg); 
); 

    _chatService.joinChat(subject); 
} 

Beachten Sie: Ich schrieb dieses aus meinem Kopf so keine Garantie, dass der Code kompiliert ..

+0

Danke für die Antwort. Probier es aus und aktualisiere dich. – Anish

+0

Ich bin in der Lage, die Nachricht zu bekommen. Ich habe Subject in RxJs untersucht. Daher die Verzögerung in der Antwort. Vielen Dank. – Anish

2

Ich denke, Carsten ist richtig können Sie unterliegen und Verhalten verwenden Betreff Ihre empfangen Massage

In Servicedatei

bekommen
message:Subject<string> = new Subject(); 

    broadcastMessage(text:string) { 
     this.message.next(text); 
    } 

und in-Komponentendatei können Sie den Betreff der Nachricht

this. _chatService.message.subscribe((msg) => { 
    console.log(“Message received from chat service class”+msg); 
}); 
+0

Lassen Sie mich versuchen und aktualisieren – Anish