将可观察订阅嵌套在另一个可观察订阅

时间:2016-12-16 14:24:04

标签: angular firebase rxjs angularfire2

我正在努力让我的头围绕Angular2中的可观察者。我对一个可观察的forEach中的一个observable有2个订阅。

所以它如下:

  1. forEach获取路径ID(民意调查ID)
  2. (嵌套在1中)subscribe使用该路由从数据库中获取轮询 ID(民意调查ID)
  3. (嵌套在2中)subscribe使用从数据库中获取createdBy用户 民意调查ids createdById
  4. 正如你所看到的那样,很多筑巢的地方感觉不对。有没有更好的方法让我实现这一目标?

    这是我的代码:

    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}`;
          });
        });
    });
    

    感谢。

2 个答案:

答案 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。 这是因为您在所有订阅中都有副作用,在flatMapswitchMap中执行副作用并不是一个好习惯,因为您无法预测它们的次数将在涉及其他运算符时执行 - 理想情况下,它们应该是纯函数。

我可以看到你正在使用Typescript,你应该使用async/await来避免所有这些回调。