Javascript 结合火基观测值和角度2

Javascript 结合火基观测值和角度2,javascript,angular,typescript,firebase-realtime-database,rxjs,Javascript,Angular,Typescript,Firebase Realtime Database,Rxjs,我正在开发angular2-firebase应用程序,我想知道一些rxjs的最佳实践,我发现谷歌很难做到这一点 假设我有一个类“Project”,它具有“name”、“$key”等属性,然后还有“Note[]”和“Task[]”数组 “Note”和“Task”是它们自己的类 最初,我在firebase中构建了如下数据: 计划 名字 标签 其他元材料 任务 任务1 任务2等 注释 注1 注2等 我会得到一个数据流,并使用map来获取数据,使其看起来完全符合我的需要 但后来我意识到,

我正在开发angular2-firebase应用程序,我想知道一些rxjs的最佳实践,我发现谷歌很难做到这一点

假设我有一个类“Project”,它具有“name”、“$key”等属性,然后还有“Note[]”和“Task[]”数组

“Note”和“Task”是它们自己的类

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

  • 计划
    • 名字
    • 标签
    • 其他元材料
    • 任务
      • 任务1
      • 任务2等
    • 注释
      • 注1
      • 注2等
我会得到一个数据流,并使用map来获取数据,使其看起来完全符合我的需要

但后来我意识到,这是一种不好的做法,项目树应该尽可能平坦,这样当我只需要项目元数据时,就不会被迫加载所有内容

所以我把它重组成这样:

  • 计划
    • 项目1
      • 名字
      • 标签
    • 项目2
      • 名字
      • 标签
  • 任务
    • 项目1
      • 任务1
        • 名字
        • 身体
      • 任务2
        • 名字
        • 身体
    • 项目2
      • 任务1
        • 名字
        • 身体
      • 任务2
        • 名字
        • 身体
  • 注释
    • 项目1
      • 注1
        • 名字
        • 身体
      • 注2
        • 名字
        • 身体
这样我就得到了三个数据流“项目”、“注释”和“任务”。 将其合并成一个包含“注释”和“任务”的“项目”流似乎是有意义的

虽然我不确定最好的方法是什么? 我编写了一个长函数,将所有内容映射到“Project[]”的数组中,但现在我只剩下一个数组而不是一个流,这肯定是错误的

或者这完全是一种错误的方法

期待着您的想法。 谢谢
我不完全理解你的结构,但如果你把“项目”、“笔记”和“任务”作为三个独立的流(我猜这意味着你有三个可观察的对象)。您可以使用或使用其中任何一个值中最先出现的值,或分别使用一个可观察值:

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));
见现场演示:

带有
concat()
的第一个示例打印:

1
2
3
a
b
c
带有
merge()
的第二个示例给出:

1
a
2
b
3
c
我想你应该理解其中的区别


不要介意
obs1
obs2
的复杂运算符链g。只是延迟地发出每个值来模拟异步流。

我不完全理解您的结构,但是如果您将“项目”、“注释”和“任务”作为三个单独的流(我猜这意味着您有三个可观察对象)。您可以使用或使用其中任何一个值中最先出现的值,或分别使用一个可观察值:

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));
见现场演示:

带有
concat()
的第一个示例打印:

1
2
3
a
b
c
带有
merge()
的第二个示例给出:

1
a
2
b
3
c
我想你应该理解其中的区别

不要介意
obs1
obs2
的复杂运算符链g。它只是以延迟发射每个值来模拟异步流