在另一个可观察的订阅中嵌套可观察订阅是否可以接受
问题描述:
我正在努力让我的头在Angular2中的观察者周围。我有一个可观察forEach内的观察2订阅。在另一个可观察的订阅中嵌套可观察订阅是否可以接受
因此,它是如下:
- 的forEach获取路线ID(轮询ID)
- (嵌套在1)认购使用路由 ID从数据库中获取投票(投票编号)
- (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}`;
});
});
});
感谢。
答
使用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问题。
答
这可能不适合Rx。 这是因为您在所有订阅中都有副作用,并且在flatMap
或switchMap
中执行副作用不是一种好的做法,因为您无法预测涉及其他操作员时将执行的次数 - 理想情况下,他们应该是纯粹的功能。
我可以看到您正在使用Typescript,并且您应该使用async/await
来避免所有这些回调。
这工作!虽然我不得不使用switchMap而不是flatMap。谢谢。 – Peza