2017-04-12 5 views
4

Ich habe eine Methode, die auf eine Observable warten muss, um zu beenden. Ich weiß, beobachtbar sind großartig für die Rückgabe einzelner Daten im Laufe der Zeit, aber ich muss wissen, wann dieses Observable vollständig fertig ist, alle seine Daten zurückgeben, damit ich Validierungscode auf das Objekt, das es zurückgegeben hat, ausführen kann.Warten auf eine Observable zu beenden

Die Methode getCustom abonniert einen beobachtbaren Lauf auf der gelieferten URL, der das Observable zurückgibt.

Ich bin mir nicht sicher, ob dies der beste Weg ist, um diese Situation anzugehen, also würde ich mich freuen, wenn mir jemand einen Rat oder eine Anweisung geben könnte, damit umzugehen.

private validateQuoteRetrievalAnswers(reference: string) { 

     // Get the risk from the server 
     this.riskManager.getRiskFromServer(reference); 

     if (this.riskManager.risk) { 
      // Validate risk that was returned 
     } 
    } 
getRiskFromServer(quoteReference: string) { 

    this.riskService.getCustom("Url").subscribe => { 
     // need to know when the observable has returned the risk 
    }); 

} 
+3

Sie können nicht warten, bis ein Observable zu Ende ist. Sie können nur abonnieren und einen Rückruf an "subscribe (...)" übergeben, der beim Eintreffen der Daten aufgerufen wird. –

+0

Diese beiden Methoden sind beide in verschiedenen Diensten, könnten Sie vielleicht ein Beispiel geben, was Sie meinen? –

+3

Dann rufen Sie 'subscribe()' nicht im Service auf (geben Sie einfach das beobachtbare 'return this.riskService.getCustom (" Url ");' zurück und verwenden Sie in dem Service, in dem Sie die Daten benötigen, 'getRiskFromServer (...) .subscribe (...) 'Siehe auch http://stackoverflow.com/questions/36271899/what-ist-the-correct-way-to-share-the-result-of-an-angular-2-http- network-call-in/36291681 # 36291681 –

Antwort

2

, wie ich diese Herausforderung angehen würde:

Abfrage Sie Back-End und als wir haben, was wir schieben müssen sie an einen Gegenstand

riskSubject = new Subject<Risk>(); 

getRiskFromServer(quoteReference: string) { 
    this.riskService.getCustom("Url") 
    .subscribe( 
    data => { this.riskSubject.next(data); }, 
    error => { console.log(error) } 
}); 
} 

und abonnieren dann zu unterwerfen und zu warten, bis Sie das bekommen, was Sie brauchen, und mit der Validierung beginnen

private validateQuoteRetrievalAnswers(reference: string) { 

     // Get the risk from the server 
     this.riskManager.getRiskFromServer(reference); 
     // subscribe to subject 
     this.riskManager.riskSubject.subscribe(
     data => { 
      //do your validation 
     }) 
} 

Das Herz eines beobachtbaren Datendienstes ist das RxJs-Thema. Die Subjekte implementieren sowohl die Observer- als auch die Observable-Schnittstelle, was bedeutet, dass wir sie sowohl zum Ausgeben von Werten als auch zum Registrieren von Subskripten verwenden können.

Das Thema ist nichts anderes als ein traditioneller Event-Bus, aber viel leistungsfähiger, da es alle funktionalen Operatoren von RxJs damit versorgt. Aber in ihrem Herzen, wir es einfach verwenden wie eine normale beobachtbaren

Quelle abonnieren: angular-university.io

OR können Sie benutzen Observable.fromPromise (Versprechen), aber das wird ein wenig komplizierter zu machen, Dinge zu verstehen Wenn Sie neu bei ng2 sind

+0

Dies ist genau das, was ich getan habe, mein Problem war ich versuchte, bestimmte Logik nach dem Erfolgs-Handler aus dem riskSubject, subscribe(). Stattdessen führte ich nur meine Operationen innerhalb der Daten = {} code block.Es war eher mein Fehler, dass ich nicht die beste Möglichkeit verstanden habe, die Verfügbarkeit eines Observablen zu nutzen –

Verwandte Themen