2016-04-16 9 views
3

いくつかのrxjs操作があるかどうか疑問に思っていました。私の並列非同期タスクが完了したかどうかを知るためにforkJoinを呼び出すことができるので、* ngIf = "loaded | async" angular2テンプレートでangular2 rxjs forkJoinを完全にチェックする方法

私は1つの解決策を思いついたが、それは私にとっては厄介なようだ。 私はこれを行うクリーナーrxJSの方法があると確信しています。

plunkrあなたがそれを必要とする場合: 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: ルカさんのコメントに基づき、これを試してみました。よく働く。はるかに良い:

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

私はあなたが '2をcombineLatest'して、ブールに' map'ことができると思います。 –

+0

あなたは正しいです!ずっといい。ありがとうございました。 –

+0

問題はない、私は答えを書いた、どうすればいいだろう。 :) –

答えて

4

combineLatestを使用してください。このような何かが動作するはずです:

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

をまた、私はそれが一度だけロードされますので、我々は唯一、一つのイベントを発する確保するために、最後にtake(1)を呼び出すことに、気づきます。

+0

ありがとうございます。私はrxjsの新人だし、知っているのはとても難しい...私が仕事をするとき...私はそれをやっかいなやり方やいいやり方でやってるの?私は知っているだろうが、今は...本当にしないよ –

+0

それについて心配しないで、みんなに時間がかかる! –

1

私はそれがより簡単かもしれないと思う:

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

あまりにも、ありがとう! –

+0

私は実際にこれを試してみましたが、失敗しました。私の本当のsomething1とsomething2が、何も返さなかった独自のマップ関数を持つobservableを返したためです。一度、私はsomething1と2のobservablesのマップ関数をtrue(または何か)を返すように変更しました。 –

関連する問題