2016-12-16 157 views
1

我正在努力讓我的頭在Angular2中的觀察者周圍。我有一個可觀察forEach內的觀察2訂閱。在另一個可觀察的訂閱中嵌套可觀察訂閱是否可以接受

因此,它是如下:

  1. 的forEach獲取路線ID(輪詢ID)
  2. (嵌套在1)認購使用路由 ID從數據庫中獲取投票(投票編號)
  3. (2嵌套)訂閱會從數據庫中使用 投票IDS 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

這工作!雖然我不得不使用switchMap而不是flatMap。謝謝。 – Peza

1

這可能不適合Rx。 這是因爲您在所有訂閱中都有副作用,並且在flatMapswitchMap中執行副作用不是一種好的做法,因爲您無法預測涉及其他操作員時將執行的次數 - 理想情況下,他們應該是純粹的功能。

我可以看到您正在使用Typescript,並且您應該使用async/await來避免所有這些回調。