【问题标题】:Multiple Observable subscription多个 Observable 订阅
【发布时间】:2017-03-02 06:00:16
【问题描述】:

我需要多次订阅才能从我的 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) => {
                });
            });
}
  • 如您所见,订阅、订阅内、订阅内..每个订阅都依赖于前一个 reslt。

  • 订阅 3 和 4 可以并行。

代码运行良好,但我是否遗漏了什么,或者这就是我认为使用多个订阅的方式,前一个的结果取决于下一个?

更新:订阅 #2 似乎有问题。订阅尚未完成,但我开始迭代列表,这给了我一个双重用户列表!

【问题讨论】:

标签: angular reactive-programming rxjs observable angularfire2


【解决方案1】:

试试这个。

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 变量很好,但是在它之后没有执行任何操作(到处都放置了控制台日志,并且它们没有显示)。合并的 observables 没有被执行。
  • 发现错误...已修复。地图应该返回 Observable.of(user) 而不是用户。 Observable.zip 需要可观察的数组
  • 我真的不知道为什么,但是map((roleData, user) => {之后的代码根本没有执行。这意味着永远无法到达return Observable.of(user)。顺便说一句没有错误
  • 没关系,我几天来一直在努力解决这些问题。代码仍未执行,但如果我更改您的代码并在return Observable.of(user) }) 之后添加订阅.subscribe(data => { }),它会执行,但未达到.subscribe(users => {
  • 请再试一次.. 而不是在Observable.of(user)之前订阅控制台日志
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-29
  • 1970-01-01
  • 2016-06-27
  • 2019-12-03
相关资源
最近更新 更多