将firebase可观察量与angular2相结合

时间:2016-10-17 10:42:59

标签: javascript angular typescript firebase-realtime-database rxjs

我正在开发一个angular2 - firebase应用程序,并且想知道一些最好的rxjs实践,我觉得很难谷歌。

假设我有一个“Project”类,其中包含“name”,“$ key”等属性。然后还有“Note []”和“Task []”的数组

“注意”和“任务”就是他们自己的类。

最初,我在firebase中构建数据,如下所示:

  • 项目
    • 名称
    • 标签
    • 其他元文章
    • 任务
      • 任务1
      • Task2等
      • 注1
      • Note2等

我会得到一个数据流并使用map来使数据看起来完全符合我的要求。

然后我意识到这是不好的做法,项目树应该尽可能平坦,以便在我只需要项目元数据时不会被迫加载所有内容。

所以我把它重组成这样:

  • 项目
    • PROJECT1
      • 名称
      • 标签
    • Project2的
      • 名称
      • 标签
  • 任务
    • PROJECT1
      • 任务1
        • 名称
      • 任务2
        • 名称
    • Project2的
      • 任务1
        • 名称
      • 任务2
        • 名称
    • PROJECT1
      • 注1
        • 名称
      • 注2
        • 名称

所以这样我获得了三个“项目”“注释”和“任务”的数据流。 将它组合成一个“项目”流,其中包含“注释”和“任务”似乎是有意义的。

虽然我不确定最好的方法是什么? 我写了一个很长的函数,concatMaps所有内容和“Project []”数组,但现在我留下了一个数组而不是一个流,这肯定是错误的。

或许这可能是一个错误的方法?

期待您的想法。 谢谢! ħ

1 个答案:

答案 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

我认为你应该理解其中的差异。

不介意obs1obs2的复杂操作员追逐。它只是通过延迟发出每个值来模拟异步流。