2017-03-17 7 views
1

RxJSとObservablesの新機能ですので、私はまだ正しい方法で自分の頭をラップして処理しようとしています。ネストされたオブザーバブルの結果となるObservablesを連結する

functionRetrieveStuff() : Observable<MyObject> {} 

functionDoStuff(param1: MyObject) : Observable<boolean> {} 

RetrieveStuffの出力がDoStuffのために入力されている:

私は2つの機能を持っています。これは、以下のコンパイルエラーになり

mainFunction() : Observable<boolean> { 
    return this.functionRetrieveStuff().map(response => { 
     return this.functionDoStuff(response); 
    }) 
} 

:私は、次の代わりにこれらを呼び出す

Error:(33, 16) TS2322: Type 'Observable<Observable<boolean>>' is not assignable to type 'Observable<boolean>'. 

タイプ「観察可能な」「ブール」とタイプして割り当て可能ではありません。

私がreactx.ioのドキュメントを正しく読んでいると、私の問題に対する解決策はswitchMapだと思います。だから私はこれに私のmainFunctionを更新した場合:

mainFunction() : Observable<boolean> { 
    return functionRetrieveStuff().switchMap(response => { 
     return functionDoStuff(response); 
    }) 
} 

コンパイルエラーが表示されなくなりますが、私は機能を使用しようとすると、私は私のcanActivateガードでmainFunctionを使用するとき、私はエラーを取得する:

TypeError: Cannot read property 'switchMap' of undefined 

ここで私は私のcanActivateガードのcanActivate方法でmainFunctionを使用方法は次のとおりです。

return this.mainFunction().first().map(result => { 
     return true; 
    }); 

私はmainFunctionを使用しているのであれば、私はわからないんだけど、私は間違ってそれを呼んでいる場合は間違っていますか。どんな洞察にも感謝します。ありがとう。

+0

あなたのmainFunctionの呼び出しはありませんガード。 functionDoStuffを呼び出すときに 'this'を使うのを忘れたようです。エラーを再現する実際の実際のコードを投稿してください。曖昧に似ているコードではありません。 –

+0

と 'functionRetrieveStuff'コード –

+0

申し訳ありませんが、完全なコードを投稿することはできませんので、私が行っていることを説明するために必要なものを簡略化しようとしていました。コードを更新しました。 –

答えて

0

あなたはswitchMap

import 'rxjs/add/operator/switchMap'; 

をインポートしてから、あなたがこの中にあるようにそれを使用する必要があります。

mainFunction() : Observable<boolean> { 
    return this.functionRetrieveStuff().switchMap(response => this.functionDoStuff(response)); 
} 

ルータが自動的に観測を購読することができますので、あなたはcanActivate機能が見えることになるでしょうこのように:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { 
    return this.mainFunction().first(); //this return Observable<boolean> since functionDoStuff is Observable<boolean> 
} 
+0

canActivateガードが監視対象をルータに返すと、ルータはそれにサブスクライブしますか? –

+0

あなたは正しいです。ガードは、ルータが購読しているオブザーバブルを返すことができます。私は私の答えを更新します。 –

関連する問題