2017-11-29 18 views
0

ビューの管理とサーバーの対話とデータ解析を管理するサービスを処理するコンポーネントがあります。角2 - 共有可観測性 - 2回目のサブスクライブエラーコールバック失敗

サービスpostFormメソッドは、コンポーネントに共有オブザーバブルを返します。 サービスがサービスをサブスクライブし、コンポーネントがサービスを提供します。

成功した場合、サービスコールバックメソッドはいくつかのデータを処理します また、成功または失敗時に、コンポーネントコールバックはビュー内のフィードバックを更新します。

問題:コンポーネントのエラーコールバックは、サービスのサブスクライブ関数にエラーコールバックが含まれている場合にのみ発生します。

私は悪いパターンを使用していますか? なぜコンポーネント1を動作させるために両方のサブスクライブ関数でエラーコールバックが必要なのですか?

おかげ

コンポーネント:

onSubmit(): void { 
    this.service.postForm().subscribe(
     () => this.onSuccessfulPost(), 
     ()=>this.onErrorPost() 
    ); 
} 

はサービス:

postForm() { 

    //Code here assembles url and body variables 

    this.currentObservable = this.http.post(url, body) 
     .map((response: Response) => this.parseResponse(response)) 
     .catch((err: Response) => this.onHttpError(err)).share(); 
    this.currentObservable.subscribe(
     (response: any) => this.onSuccessfulPost(response), 
     () => {return} //WITHOUT THIS LINE COMPONENT CALL FAILS 
    ); 
    return this.currentObservable; 
} 

答えて

0

私はそれがエラーコールバックなしで動作しない理由は、二人の観察者がそれぞれの独立していなければならないか分かりませんその他。しかしパターン的には、私はサービスに加入しないで、コンポーネントに加入したままにしておきます。応答に依存しないサービスでロジックを実行する必要がある場合は、do演算子を使用できます。

postForm() { 
    //Code here assembles url and body variables 

    this.currentObservable = this.http.post(url, body) 
     .map((response: Response) => this.parseResponse(response)) 
     .catch((err: Response) => this.onHttpError(err)) 
     .do(response => this.onSuccessfulPost(response)); 
    return this.currentObservable; 
} 

あなただけの1人の観測者(加入者)を持っているので、あなたがシェアを必要としないもう

+0

だけのノート... RxJx 5.5のように、* *やる今*タップ*です。 – DeborahK

+0

@DeborahKああ良い洞察力。これはドット演算子に当てはまりますか?またはlettable演算子だけ? – LLai

+1

https://github.com/ReactiveX/rxjs/blob/master/doc/lettable-operators.mdのlettableバージョンですが、私たちはその方向にすべて動いていると仮定しましたか? – DeborahK

関連する問題