【问题标题】:RxJS Waiting for nested observable to filter array dataRxJS 等待嵌套的 observable 过滤数组数据
【发布时间】:2018-02-10 11:09:37
【问题描述】:

有两个Observablesfoobar

foo 将返回 array 对象,例如 [{ id: 1 }, { id: 2 }, ...](它将返回整个数组(在此处使用 AngularFire .list))

bar 对从foo 返回的每个项目都有一个存储值。该值存储为一个对象,如下所示:{ id: 2, status: false }

这里需要做的是最初调用foo,在它的map函数中,我想从subscribe()方法中取出{ id: 2 },如果它在bar的响应中匹配值是false

换种说法

  1. 观看来自foo 的流
  2. .map 对象并检查来自bar每个对象 状态
  3. bar 返回一个值为 truefalse 的 observable
  4. .filterfoo取出任何带有status的对象为false

我尝试了combineLatestzip 和其他RxJS 方法,但不确定我是否正确执行此操作。有人可以告诉我正确的方法,或者至少指出我们应该探索哪些方法吗?

感谢您的帮助!

谢谢。

//

.... foo
....... itemId1
....... itemId2

.... bar
....... itemId1: true
....... itemId2: false

订阅foo时,它返回的数组必须是filtered才能返回itemId1,因为它的bar值是true(都是observables,foo和bar ofc)

【问题讨论】:

  • foo 是逐个发出值还是一次发出整个数组?如果您展示了重新创建所需行为的尝试,那就太好了。我猜, zip 或 combineLatest 应该都可以工作。
  • Hi @BorisLobanov foo 发出整个数组。
  • bar 也会发出布尔数组吗?
  • 其实很抱歉,bar 将根据来自foo 的个人id 发出一个Object。所以需要将它们映射在一起,对于foo中数组中的每个id,从bar中的相关对象中获取最新值。希望我没有让这件事复杂化
  • 你能看看我做的 jsfiddle 看看它是否在做你需要的事情吗? jsfiddle.net/pp6zpx9u

标签: javascript firebase rxjs angularfire2 reactivex


【解决方案1】:

这是完成工作的一段代码:

foo = Rx.Observable.of([
  {id: 1, data: 'foo1'}, 
  {id: 2, data: 'foo2'}, 
  {id: 3, data: 'foo3'}, 
  {id: 4, data: 'foo4'}, 
  {id: 5, data: 'foo5'}, 
  {id: 6, data: 'foo6'}
]);

bar = Rx.Observable.of([
  {id: 1, status: false}, 
  {id: 2, status: true}, 
  {id: 3, status: true}, 
  {id: 4, status: false}, 
  {id: 5, status: true}, 
  {id: 6, status: false}
]).flatMap(obj => obj);

Rx.Observable.combineLatest(foo, bar)
    .filter(([foo, bar]) => bar.status)
    .map(([foo, bar]) => foo.find(obj => obj.id === bar.id))
  .subscribe(data => {
    console.log(data)
  });

【讨论】:

  • 问题,请检查:jsfiddle.net/pp6zpx9u/5 现在它返回undefined,因为我添加了一个不存在的密钥。有什么好的解决方法?感谢您是否可以提供帮助。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多