我正在努力让我的头围绕Angular2中的可观察者。我对一个可观察的forEach中的一个observable有2个订阅。
所以它如下:
正如你所看到的那样,很多筑巢的地方感觉不对。有没有更好的方法让我实现这一目标?
这是我的代码:
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}`;
});
});
});
感谢。
答案 0 :(得分:4)
改为使用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}`;
});
它将自动展开嵌套的observable,并有助于避免与callback hell类似的问题。
答案 1 :(得分:1)
这可能不适合Rx。
这是因为您在所有订阅中都有副作用,在flatMap
或switchMap
中执行副作用并不是一个好习惯,因为您无法预测它们的次数将在涉及其他运算符时执行 - 理想情况下,它们应该是纯函数。
我可以看到你正在使用Typescript,你应该使用async/await
来避免所有这些回调。