angular 4 mergeMap问题

时间:2017-08-06 06:01:59

标签: javascript angular

我正在使用angularfire,我需要"加入"密钥上有两个节点。 这是我的方法:

  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时,它是未定义的。虽然如果我只记录环聊,我会得到一系列对象。

我如何使用mergeMap返回一个包含第一个查询和第二个查询的结果的observable?在这种情况下,环聊本身和属于他们的用户?

在控制台中我得到: enter image description here

这些是我想加入的2个节点: enter image description here enter image description here

@Maximus这是我得到的结果我可以获得数组中的所有对象然后使用ngFor吗? [![在此处输入图像说明] [4]] [4]

1 个答案:

答案 0 :(得分:0)

这应该适用于一般情况:

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

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))