2016-12-16 29 views
1

私はAngular2のオブザーバブルの周りに頭を浮かべるのに苦労しています。私はobservable forEachの中でobservableに2つのサブスクリプションを持っています。以下のように、それはだ観測可能なサブスクリプションを別の観測可能なサブスクリプションにネストすることは可能ですか?

  1. forEachのルートID(ポーリングID)
  2. (1でネストされた)を取得購読ルート ID(ポーリングID)
  3. を使用して、データベースからの投票を取得します(2内にネスト)
  4. 購読は ポーリングIDはあなたが起こってネスティングの多くがあります見ることができるよう

をcreatedById使用してデータベースからCREATEDBYのユーザーを取得しますちょうどいい気分にはならない。これを達成するためのよりよい方法がありますか?

poll: Poll; 
createdBy: string; 

constructor(public route: ActivatedRoute, public teamPollsService: TeamPollsService) { } 

ngOnInit(): void { 
let id: any; 

// 1. 
this.route.params.forEach((params: Params) => { 
    id = params['id']; 

    // 2. 
    this.pollService.getPoll(id).subscribe((x) => { 
     this.poll = x; 

     // 3. 
     this.users.getDbUser(x.createdById).subscribe((user) => { 
     createdBy = `${user.firstName} ${user.lastName}`; 
     }); 
    }); 
}); 

ありがとう:

は、これは私のコードです。代わりに

答えて

3

使用flatMap()

this.route.params 
    .flatMap((params: Params) => { 
     id = params['id']; 
     return this.pollService.getPoll(id); 
    }) 
    .flatMap((x) => { 
     this.poll = x; 
     return this.users.getDbUser(x.createdById); 
    }) 
    .subscribe((user) => { 
     createdBy = `${user.firstName} ${user.lastName}`; 
    }); 

それは自動的にアンラップネストされた観測とcallback hellに似た問題を回避するのに役立ちますでしょう。

+1

これは機能しました!私はflatMapの代わりにswitchMapを使用しなければならなかった。ありがとうございました。 – Peza

1

これはRxには適していない可能性があります。 これは、すべてのサブスクリプションで副作用があり、副作用をflatMapまたはswitchMapで実行することは、他の演算子が関係しているときに実行する回数を予測できないためには理想的ではありません純粋な関数でなければなりません。

Typescriptを使用していることがわかりますが、これらのコールバックをすべて避けるにはasync/awaitを使用する必要があります。

関連する問題