2017-09-19 4 views
1

Ich frage mich, ob es möglich ist zu überprüfen, ob Observable einen Wert erhalten. Und ich will das, ohne es zu abonnieren, weil ich zu faul bin, meinen aktuellen Code zu überschreiben. Problem ist, dass ich Observable in der übergeordneten Komponente erstellen und dann an untergeordnete Komponenten übergeben. Und ich brauche nur ein winziges Ding von ihm, also nur für die Anmeldung, scheint unnötig ...Rxjs - prüfen, ob Observable leer ist, ohne es zu abonnieren

Eltern-Komponente:

adverts$: Observable<advert[]>; 

    ngOnInit() { 
    this.adverts$ = this.advertService.advertsPerUser(); 

Service:

advertsPerUser() { 
    return this.advertsKeysPerUser() 
     .map(adKeys => adKeys.map(adKey => this.afDb.object('adverts/' + adKey.$key))) 
     .flatMap(val => Observable.combineLatest(val)); 
    } 

Also mein Ziel ist es in parent-component.html etwas tun wie:

<div *ngIf="adverts$"> 
+0

Ein 'Observable' hat keinen Wert, es gibt einen Wert aus, wenn die Quelle einen Wert ausgibt. Ich verstehe nicht, was das Problem mit 'subscribe()' ist. Ist der Wert asynchron? Verwenden Sie nicht "Observable", wenn Sie nicht asynchron möchten. Wenn Sie gezwungen sind, asynchron zu werden, haben Sie kein Glück. Es gibt keinen Weg zurück von asynchron zur Synchronisierung. –

+0

@ Günter Zöchbauer - Meine einzige Sorge hier ist Leistung. Ich dachte, wenn ich überprüfen könnte, ob Observable leer ist oder nicht, ohne es zu abonnieren, würde es etwas Speicher sparen ... Und es sieht auch komisch im Allgemeinen aus - Erstellen eines Streams, nur um zu überprüfen, ob irgendetwas darin ist .. –

+1

Klingt wie ein spezieller Fall einer vorzeitigen Optimierung ;-) –

Antwort

3

Kurz gesagt, nein.

Standardmäßig ist Observable Unicast verhält sich ähnlich wie Funktion, also gibt Wert an Beobachter, sobald es tatsächlich abonniert ist. Es ist wichtig, es ist ähnlich wie Funktion, Abonnieren ist der eigentliche Versuch, diese Observablen zu starten. Wenn Sie an eine typische Funktion denken, die einen Wert zurückgibt (oder nicht), können Sie nicht wissen, bis die Funktion tatsächlich ausgeführt wird und ihre Ergebnisse zurückgibt. Gleiches gilt für Observable. Sie können die Werte der Quelle nicht verwenden, bis Sie sie abonniert haben.