2016-03-25 26 views
3

複数のオブザーバを連結することは可能ですか?例えばrxjs Observablesを連結する

: 私は3機能があります。

よう
Observable.combine (ensureUserLogged(), createEntity(), checkEntity()).subscribe (
    checkEntityResult => console.log (checkEntityResult), 
    error => console.log (error) 
); 

か何か:私はのような何かやりたい

ensureUserLogged():Observable<boolean> 

createEntity():Observable<Entity> 

checkEntity():Observable<boolean> 

ensureUserLogged().then (logged => createEntity()).then (newEntity => checkEntity())... 

をそうでなければ、私がする必要があります醜いピラミッドを書く:

ensureUserLogged().subscribe (
    res => { 
     createEntity().subscribe (
      res => { 
       checkEntity().subscribe (
        res => { console.log ("I'm finally here") }, 
        error {} 
       ) 
      }, 
      err => { 
      } 
     ); 
    }, 
    err => { 
    } 
) 

私の意志を達成するために何かありますか?あなたが並列実行ためObservable.forkJoinを使用する必要が

おかげ

答えて

6

Observable.forkJoin(ensureUserLogged(), createEntity(), checkEntity()).subscribe (
    checkEntityResult => console.log (checkEntityResult), 
    error => console.log (error) 
); 

checkEntityResultは、各要素を含む配列に対応する:ensureUserLoggedの結果のための最初のものを、...

に実行するには、を使用する必要があります0演算子:

ensureUserLogged().flatMap((resultOfEnsureUserLogged) => { 
    return createEntity(); 
}).flatMap((resultOfCreateEntity) => { 
    return checkEntity(); 
}).subscribe((resultOfChekEntity) => { 
    (...) 
}); 

物事を混在させることができます。たとえば、次のようなものです。

ensureUserLogged().flatMap((resultOfEnsureUserLogged) => { 
    return Observable.forJoin(createEntity(), checkEntity()); 
}).subscribe((resultOfCreateEntityAndChekEntity) => { 
    (...) 
}); 
+0

createEntity(2番目のObservable)に以前のObservableの結果が必要な場合はどうなりますか? – user3471528

+0

編集:Thierryさん、ありがとうございます。したがって、flatMapを使用して、前回のサブスクリプションにも以前のメソッドによってスローされた例外が含まれていますか? – user3471528

+0

実際、以前の観測結果は、flatMapコールバックのパラメータとして受け取ったものです。 –

関連する問題