2016-04-16 5 views
3

Ich frage mich, ob es einige Rxjs Operation ich kann nach ForkJoin aufrufen, um zu wissen, ob meine parallelen asynchronen Aufgaben abgeschlossen sind, so kann ich etwas wie * ngIf = "geladen | async" haben in angular2 Vorlage.angular2 rxjs Weg zu überprüfen forkJoin komplett gemacht

Ich kam mit einer Lösung, aber es scheint mir chaotisch. Ich wette, es gibt eine sauberere rxJS Art und Weise, dies zu tun.

plunkr wenn Sie es brauchen: https://plnkr.co/edit/UFVCJpjKAEGguMls5eIl?p=preview

public loaded:Observable<boolean>; 

constructor(private http:Http) { 
    // This is the best solution I could come up with. Is there a cleaner way 
    // by just calling some operation after forkJoin instead of building my own observable? 
    this.loaded = Observable.create((observer) => { 
     observer.next(false); 
     Observable.forkJoin(
      this.something1(), 
      this.something2(), 
      () => { 
       // now we know we have finished 
       observer.next(true); 
      } 
     ).subscribe(); 
    }); 
} 

something1() { 
    return this.http.get('test1.json').map((res) => res.json()); 
} 

something2() { 
    return this.http.get('test2.json').map((res) => res.json()); 
} 

UPDATE: Basierend auf Luka Kommentar, dies versucht. funktioniert super. viel schöner:

this.loaded = Observable.combineLatest(
    this.something1(), 
    this.something2(), 
    () => { 
     // now we know we have finished 
     return true 
    } 
); 
+2

Ich denke, können Sie 'combineLatest' die beiden und dann' map' in einen Booleschen. –

+0

Sie haben Recht! Viel besser. Danke. –

+0

Kein Problem, ich schrieb eine Antwort, wie ich es machen würde. :) –

Antwort

4

Verwenden Sie combineLatest. So etwas sollte funktionieren:

this.loaded = this.something1().combineLatest(
    this.something2(), 
    function (s1, s2) { return true } 
).take(1); 

Beachten Sie auch, dass ich take(1) am Ende rufen, um sicherzustellen, dass wir eine Veranstaltung nur emittieren, da sie nur einmal geladen werde.

+0

danke. Ich bin neu bei rxjs und es ist so schwer zu wissen ... wenn ich Sachen in Arbeit bekomme ... mache ich es auf eine dumme Weise oder auf eine gute Art? in der Zeit werde ich wissen, aber für jetzt..ich wirklich nicht –

+0

Mach dir keine Sorgen darüber, es braucht Zeit für alle! –

1

ich denke, es einfacher sein könnte:

this.loaded = Observable.forkJoin(this.something1(), this.something2()).map(_=>true); 
+0

Ja, das funktioniert auch, danke! –

+0

Ich hatte das tatsächlich versucht, aber es scheiterte ... weil mein echtes something1 und something2 observable's zurückgab, die ihre eigenen Kartenfunktionen hatten, die nichts zurückgaben. Sobald ich die Map-Funktionen von Observable 1 und 2 geändert habe, um True (oder irgendetwas) zurückzugeben, funktionierte es. –

Verwandte Themen