多个可观察对象的订阅

5

我需要多次订阅才能获得我NoSQL数据库的正确数据。为了获取特定项目的用户列表,我这样做:

ngOnInit() {
    //Subscription 1 (Service): Get project data
    this.projectService.getCurrentproject().take(1).subscribe(projectData => {
        console.log('Got project data.');
        //Subscription 2: Get project user IDS
        this.af.database.list('/project_roles/'+projectData.$key)
            .subscribe((userMeta) => {
                });
            });
}
  • 如您所见,一个订阅内嵌在另一个订阅中,每个订阅都依赖于前一个结果。

  • 订阅3和4可以并行执行。

代码运行良好,但我是否遗漏了什么或者这就是我应该处理多个订阅的方式,即前一个结果决定下一个结果?

更新:订阅#2似乎有问题。订阅尚未完成,但我已经开始迭代列表,这导致我得到了一个重复的用户列表!


你有检查过 flatMap 操作符吗? https://dev59.com/2loV5IYBdhLWcg3wGbfS#36712707 - eko
不确定我所做的和flatMap之间有什么区别,也不知道如何将其与我的4个订阅一起使用。 - Reni
1个回答

0

试一下。

ngOnInit() {
    this.projectService.getCurrentproject().take(1)
        .flatMap(projectData => {
            return this.af.database.list('/project_roles/'+projectData.$key)
        })
        .flatMap(userMeta => {
            let subs = userMeta.map(projectRole => {
                return Observable.zip([
                    this.af.database.object('/roles/'+projectRole.$value),
                    this.af.database.object('/users/'+projectRole.$key)
                ]).map(([roleData, user]) => {
                    user.role = roleData.$value;
                    return Observable.of(user)
                })
            });
            return Observable.zip(subs)
        })
        .subscribe(users => {
            this.users = users
        })
}

基本上我正在组合订阅以获取发出用户数组的单个可观察对象


有趣。这个组织得更好了 - 但是它不起作用。我调查了一下,userMeta变量很好,但在此之后没有执行任何操作(放置了控制台日志,但它们没有显示)。合并可观察对象没有被执行。 - Reni
发现一个错误...已经修复。地图应该返回Observable.of(user)而不是user。Observable.zip期望可观察数组。 - Gaurav Mukherjee
请再试一次,并在 Observable.of(user) 之前使用控制台日志,而不是订阅。 - Gaurav Mukherjee
我在各个地方都使用了控制台日志,但是Observable.of(user)之前的控制台日志没有显示(以及this.users = users;之前的那个)。 - Reni
是的,我会观察你所做的任何更改并尝试它。 - Reni
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接