2017-11-27 4 views
1

私はとしてBehaviorSubjectを宣言しました。flatMap内でBehaviorSubjectを更新するにはどうすればよいですか?

私はsubscribeの中でnext()と更新する方法を知っていますが、flatMap()の後にどのように更新できますか?

BehaviourSubject

user = new BehaviorSubject<Object>({}); 

(ユーザデータの後に)ユーザデータおよびユーザの詳細データを設定する方法。私がいることを前提としたいthis.userDetailsService.getUserDetails詳細なしで

{ 

    "id": 1, 
    "name": "Test", 
    "details1": "other", 
    "details2": "other" 

} 
+0

私は 'this.user.next(データ)'に問題が何を理解していません。 'flatMap'の後に呼び出されます。たぶんあなたは 'do(user => this.user.next(user))'を探しています。 – martin

+0

私はモデルの詳細で質問を更新しました –

+0

実際にはどこに問題があるのか​​まだ分かりません。最初に元のオブジェクトを 'BehaviorSubject'に入れて、それを" enhanced "オブジェクトに置き換えたいのですか? – martin

答えて

0

{ 

    "id": 1, 
    "name": "Test" 

} 

userDetailsServiceを呼び出した後、ユーザーはのような詳細を取得する必要があります

this.userDetailsService.getUserDetails() 
.flatMap((res) => { 
    //update this.user details in res?? 
    return this.getUser(); 
} 
).subscribe(
    data => {this.user.next(data)} 
); 

は、ユーザーオブジェクトは、次のようになりますこれはあなたが望むものです:

this.user = this.userDetailsService.getUserDetails() 
    .flatMap((res) => { 
     return this.getUser(); 
    } 
+0

userDetailsS​​erviceで質問を更新しました。購読した後で、私はuserDetailsS​​erviceからさらに多くのデータを取得します。 –

0

BehaviorSubjectは、新しいサブスクライバに最後に発行されたオブジェクトを返します。すでにサブスクライブしている場合は、nextが呼び出されたときに通知されます。

考えられる解決策:

user: User; 

this.userDetailsService.getUserDetails() 
.switchMap((details) => updateDetails(details)) 
.subscribe(user => {this.user = user)}); 

updateDetails(details): Observable<User> { 
    return this.getUser().do((user) => user.setDetails(details)); 
} 

getUser(): Observable<User> { 
return Observable.of(this.user); 
} 
関連する問題