如何在另一个订阅中使用和维护多个订阅?

时间:2018-08-15 05:58:59

标签: angular firebase rxjs google-cloud-firestore

我目前正在使用带有Firestore数据库和Angular的firebase构建项目。在我的Firestore数据库中,我有一个任务集合和一个所有者集合。每个任务都有对所有者(例如owner: -l3sdfkl3sdflksdf)的引用(外键)。一个所有者可以链接到多个任务,其中一个任务只能有一个所有者。

在我的Angular组件之一中,我想显示我所有任务的列表,包括每个任务的一些所有者信息。我编写了一种服务方法来订阅任务集合,并且在该订阅中,我不想为每个任务订阅所有者。因为我的组件还希望在所有者属性之一(对于链接到一个任务的所有者)发生变化时被触发。

我目前正在考虑这样的事情,但是我想知道这是否明智,可维护,我应该如何退订等等等

getTasks(): Observable<Task[]> {
    return this.afs.collection<Task>('tasks').snapshotchanges().map((actions: DocumentChangeAction[]) => {
        let tasks: Task[] = [];
        actions.forEach((action: DocumentChangeAction) => {
            let task: any = { id: action.payload.doc.id, ...action.payload.doc.data() };

            // Per task, subscribe to the owner, how?
            this.getOwner(task.id).subscribe((owner: Owner) => {
                task.owner = owner;
                return tasks;
            });


            tasks.push(task);
        });
        return tasks;
    });
}

我不喜欢在组件本身中进行每个所有者的检索,这可能是因为将来我有多个组件需要此任务列表,包括所有者,而我只是认为这不是组件的责任组件。

有关如何解决此类问题的任何提示?谢谢!

2 个答案:

答案 0 :(得分:0)

首先,您可以将getOwner和task数据处理方法放在单独的task.service Service中。组件只需要处理UI逻辑,就流而言,您可以如下优化它 (假设您使用的是rxjs5)

getTasks(): Observable < Task[] > {
return this.afs.collection < Task > ('tasks').snapshotchanges()
  .mergeMap((actions: DocumentChangeAction[]) => Observable.from(actions))
  .switchMap((action: DocumentChangeAction) => {
    let task: any = {
      id: action.payload.doc.id,
      ...action.payload.doc.data()
    };
    // Per task, subscribe to the owner, how?
    return this.taskService.getOwner(task.id).map((owner: Owner) => {
      task.owner = owner;
      return task
    });
  }).reduce((acc,curr)=>{
  acc.push(curr)
  return acc
  },[])
}

答案 1 :(得分:-1)

也许您应该在看switchMap或RxJS的其他地图运算符; flatMap, mergeMap, switchMap and concatMap in rxjs?

这里给出了另一个清晰的例子; https://www.youtube.com/watch?v=6lKoLwGlglE