2016-12-16 136 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来避免所有这些回调。