首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >angular 4 mergeMap问题

angular 4 mergeMap问题
EN

Stack Overflow用户
提问于 2017-08-06 14:01:59
回答 1查看 864关注 0票数 1

我正在使用angularfire,我需要在key上“连接”两个节点。这是我的方法:

代码语言:javascript
复制
  mergetest(userkey){
return this.db.list(`userOwnHangouts/${userkey}`)
  .mergeMap((hangouts) => {
    console.log('the merge hangout: ', hangouts.$key) //undefined
    return this.db.list(`hangoutInterestedUsers/${hangouts.$key}`)
  })
  .subscribe(x => console.log('subscribe: ', x))
 }

正如您所看到的,当我尝试获取$key时,它是未定义的。不过,如果我只记录hangouts,我确实会得到一个对象数组。

如何使用mergeMap返回一个既包含第一个查询的结果又包含第二个查询的结果的可观察对象?在这种情况下,hangouts本身和属于它们的用户呢?

在控制台中,我得到:

下面是我想加入的两个节点:

@Maximus这是我得到的结果,我能得到一个数组中的所有对象,然后用ngFor吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-06 14:13:21

这在一般情况下应该是有效的:

代码语言:javascript
复制
return this.db.list(`userOwnHangouts/${userkey}`)
   // flattening the array returned by `list()`
  .mergeMap((o) => {
    return o;
  })
  .mergeMap((o) => {
    return this.db.list(`hangoutInterestedUsers/${o['$key']}`).map((users) => {
       return {...o, users: users};
    });
  })
  .reduce((acc, v) => {
    acc.push(v);
    return acc;
  }, [])
  .subscribe(x => console.log('subscribe: ', x))
 }

编辑:

但是因为两个this.db.list都不能完成,所以我们不能在这里使用reduce。同样,由于同样的原因,forkJoin也不会工作。所以我们要做的就是combineLatest

代码语言:javascript
复制
this.db.list(`userOwnHangouts/${userkey}`)
    .switchMap((list: any[]) => Rx.Observable.combineLatest(
        list.map((item: any) => this.db.list(`hangoutInterestedUsers/${item['$key']}`)),
        (...results: any[][]) => {
            list.forEach((item: any, index: number) => {
                item["users"] = results[index];
            });
            return list;
        }
    ))
    .subscribe(x => console.log('subscribe: ', x))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45529059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档