【问题标题】:How to merge the flatMap emits?如何合并 flatMap 发射?
【发布时间】:2018-09-04 17:44:44
【问题描述】:

在 switchMap 运算符之后,我使用 flatMap 运算符获取对象可观察数据

return this.db.list(`UserPlaces/${this.authData.auth.auth.currentUser.uid}`, {
    query: {
      orderByChild: 'deleted',
      equalTo: false
    }
  })
  .map((locations: any) => {
    console.log(JSON.stringify(locations,null,2)); // this log is called 0
    return locations.map(location => {
      return location.$key;
    });
  }).switchMap(ids => {
    return ids.map(id => {
      console.log(id) // this log is called 1
      return this.db.object(`Devices/${id}`)
    });
  }).flatMap((x: any) => {
    console.log(x); // this log is called 2
    return x;
  }).map((x:any)=>{
    console.log(x); 
     if(!x.deleted){
      return x;
    }
  })
  .do(console.log) // and this log is called 3

日志 0:

[
  {
    "deleted": false,
    "guest": false,
    "owner": true
  },
  {
    "deleted": false,
    "guest": false,
    "owner": true
  },
  {
    "deleted": false,
    "guest": false,
    "owner": true
  },
  {
    "deleted": false,
    "guest": false,
    "owner": true
  },
  {
    "deleted": false,
    "guest": false,
    "owner": true
  },
  {
    "deleted": false,
    "guest": false,
    "owner": true
  },
  {
    "deleted": false,
    "guest": false,
    "owner": true
  }
] 

日志 1:

-L8CmrV8BBQCVv_0x_-6
-L8CnDqHz_VWP9dpw-tz
-L8CxQ_bz4EQSPa4STUd
-L8CxSaF1JdHwhn3YyrC
-L8WVlwWj-ghpZsx2PEE
-L8WW5QbxxNMeWonNdSg
-L8XJHI0-ZhPAA9Xy3Sx

日志 2:

FirebaseObjectObservable {_isScalar: false, $ref: U, source: FirebaseObjectObservable, operator: ObserveOnOperator}
FirebaseObjectObservable {_isScalar: false, $ref: U, source: FirebaseObjectObservable, operator: ObserveOnOperator}
FirebaseObjectObservable {_isScalar: false, $ref: U, source: FirebaseObjectObservable, operator: ObserveOnOperator}
FirebaseObjectObservable {_isScalar: false, $ref: U, source: FirebaseObjectObservable, operator: ObserveOnOperator}
FirebaseObjectObservable {_isScalar: false, $ref: U, source: FirebaseObjectObservable, operator: ObserveOnOperator}
FirebaseObjectObservable {_isScalar: false, $ref: U, source: FirebaseObjectObservable, operator: ObserveOnOperator}
FirebaseObjectObservable {_isScalar: false, $ref: U, source: FirebaseObjectObservable, operator: ObserveOnOperator}

日志 3:

{deleted: false, id: "", name: "new place", owner: "cS81XkHhVHNv0nmpVit0Glpuc1t1", tone: "default", …}
{deleted: false, id: "", name: "new one", owner: "cS81XkHhVHNv0nmpVit0Glpuc1t1", tone: "default", …}
{deleted: false, id: "", name: "nice", owner: "cS81XkHhVHNv0nmpVit0Glpuc1t1", tone: "default", …}
{deleted: false, id: "", name: "new one", owner: "cS81XkHhVHNv0nmpVit0Glpuc1t1", rooms: {…}, …}
{deleted: false, id: "", name: "das", owner: "cS81XkHhVHNv0nmpVit0Glpuc1t1", tone: "default", …}

我需要将日志 3 合并为对象数组而不是单独的对象。

我的目标是:

显示一个离子选择,它在阵列中循环并显示地名。

谢谢。

【问题讨论】:

  • 如果源代码完成,您可以在链的末尾使用toArray()。如果没有,您可以使用scan() 收集结果
  • @martin 感谢您的回复,但您能否将您的意见作为问题添加,更清楚
  • 你想要zip这样的东西吗?
  • @sabithpocker 我是 RXJS 世界的新人,所以我不知道 zip 到底在做什么,所以你可以添加一个答案来测试 zip 运算符吗?同时我会读到它
  • 请耐心等待。阅读并在此处回复。

标签: angular typescript firebase ionic2 rxjs


【解决方案1】:

如果源完成:

return this.db.list(`UserPlaces/${this.authData.auth.auth.currentUser.uid}`, { ... })
  ...
  .toArray()
  .do(console.log) // and this log is called 3

或者如果它没有使用scan() 收集结果:

return this.db.list(`UserPlaces/${this.authData.auth.auth.currentUser.uid}`, { ... })
  ...
  .scan((acc, item) => [...acc, item], [])
  .do(console.log) // and this log is called 3

顺便说一句,看起来你是故意用以下方法解开数组:

...
.flatMap((x: any) => {
  console.log(x); // this log is called 2
  return x;
}
...

【讨论】:

  • .scan((acc, item) => [...acc, item], []) 你能解释一下这个以及如何使用它
  • 它只是在物品到达时收集它们并发出结果数组
  • 这是正确的想法,但我认为你想要减少而不是扫描
  • @AluanHaddad 可以添加答案吗
  • 添加.scan((acc, item) => [...acc, item], [])@martin很有效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
  • 2021-03-06
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多