我正在开发一个angular2 - firebase应用程序,并且想知道一些最好的rxjs实践,我觉得很难谷歌。
假设我有一个“Project”类,其中包含“name”,“$ key”等属性。然后还有“Note []”和“Task []”的数组
“注意”和“任务”就是他们自己的类。
最初,我在firebase中构建数据,如下所示:
我会得到一个数据流并使用map来使数据看起来完全符合我的要求。
然后我意识到这是不好的做法,项目树应该尽可能平坦,以便在我只需要项目元数据时不会被迫加载所有内容。
所以我把它重组成这样:
所以这样我获得了三个“项目”“注释”和“任务”的数据流。 将它组合成一个“项目”流,其中包含“注释”和“任务”似乎是有意义的。
虽然我不确定最好的方法是什么? 我写了一个很长的函数,concatMaps所有内容和“Project []”数组,但现在我留下了一个数组而不是一个流,这肯定是错误的。
或许这可能是一个错误的方法?
期待您的想法。 谢谢! ħ
答案 0 :(得分:0)
我不完全理解你的结构,但如果你有“项目”“注释”和“任务”作为三个独立的流(我猜这意味着你有三个Observable)。您可以使用merge()
或concat()
来消耗其中任何一个值,或者分别使用一个Observable:
let obs1 = Observable.from([1, 2, 3]).map(v => Observable.of(v).delay(1000)).concatAll();
let obs2 = Observable.from(['a', 'b', 'c']).map(v => Observable.of(v).delay(1000)).concatAll();
obs1.concat(obs2)
.subscribe(v => console.log(v));
obs1.merge(obs2)
.subscribe(v => console.log(v));
查看现场演示:http://plnkr.co/edit/TLxg1jOuhAN6U8xoQJIo?p=preview
打印concat()
的第一个示例:
1
2
3
a
b
c
merge()
的第二个例子给出了:
1
a
2
b
3
c
我认为你应该理解其中的差异。
不介意obs1
和obs2
的复杂操作员追逐。它只是通过延迟发出每个值来模拟异步流。