将firebase可观察对象与angular2结合

Combining firebase observables with angular2

本文关键字:angular2 结合 对象 观察 firebase      更新时间:2023-09-26

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

假设我有一个类"Project",它有"name"、"$key"等属性。还有"Note[]"answers"Task[]"的数组

"Note"answers"Task"是它们自己的类。

最初我在firebase中这样结构化数据:

  • 项目
      <
    • 名称/gh>
    • 标记
    • 任务
        Task1
      • Task2等
    • 笔记
      • 注一
      • 注2等

我将得到一个数据流,并使用map来得到我想要的数据。

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

所以我把它重新构造成这样:

  • 项目
    • Project1
        <
      • 名称/gh>
      • 标记
    • Project2
        <
      • 名称/gh>
      • 标记
  • 任务
    • Project1
      • Task1
          <
        • 名称/gh>身体
      • Task2
          <
        • 名称/gh>身体
    • Project2
      • Task1
          <
        • 名称/gh>身体
      • Task2
          <
        • 名称/gh>身体
  • 笔记
    • Project1
      • 注一
          <
        • 名称/gh>身体
      • 注2
          <
        • 名称/gh>身体

这样我就得到了"项目"、"笔记"answers"任务"三个数据流。把它合并成一个"项目"流,里面有"笔记"answers"任务",似乎是有意义的。

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

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

期待你的想法。谢谢!H

我不完全理解你的结构,但如果你有"项目" "笔记"answers"任务"作为三个独立的流(我猜这意味着你有三个可观察对象)。你可以使用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复杂的操作符变化。它只是用延迟发出每个值来模拟异步流。