获得最新的订阅价值

时间:2019-07-18 14:03:33

标签: angular rxjs

我有一个订阅,该订阅将获取状态为“待定-已验证-已完成”的总体行的“状态”,这些将在API中进行检查并在数据库中进行更新。

我有一个方法可以用此状态更新行为主体。由于状态影响网页的某些部分,因此有多个组件订阅了行为主题。

private statusSubject= new Subject();
 CurrentStatus$ = this.statusSubject.asObservable();

 getStatus(id: number) {
   return this.client.getStatus(id).pipe(
     tap((x) => this.statusSubject.next(x)),
   );
 }

但是,要获取最新状态,我需要启动另一个getStatus.subscribe()来更新行为主题。它是否正确?我以为只要有变化,一次订阅就能使发射的值恢复原状?作为“活动流”。

2 个答案:

答案 0 :(得分:0)

这样的事情呢?根据您的评论。

服务:

deleteLine(id: number) {
    return this.client.deleteLine(id);
}

getStatus(id:number) {
    return this.client.getStatus(id);
}

组件:

this.someService.deleteLine(1).pipe(
    tap(line => this.line = line),
    flatMap(line => this.someService.getStatus(line.id)))
    .subscribe(status => this.status = status); //or whatever you need to do in subscribe, if anything

答案 1 :(得分:0)

因此,这似乎是状态管理/应用程序体系结构问题的重中之重。

通常,您似乎有一些通用的应用程序状态,可以这样描述:

{
    latestStatus: Status;
    lines: Line[];
}

似乎创建/更新/删除行具有更改状态的副作用,因此需要发生副作用,那么该怎么做?

我会这样构造它,所以我的StatusService看起来像:

private statusSubject= new Subject();
CurrentStatus$ = this.statusSubject.asObservable();
private updateStatusSubject = new Subject<number>();

constructor() {
  this.updateStatusSubject.pipe(
    switchMap(id => this.client.getStatus(id))
  ).subscribe(this.statusSubject);
}

updateStatus(id: number) {
   this.updateStatusSubject.next(id);
}

然后我的理论LineService将执行以下操作:

constructor(private statusService: StatusService) {}

updateLine(id, data) {
  return this.client.updateLine(id, data).pipe(tap(() => this.statusService.updateStatus(id)));
}

这可以确保事物的排序并将事物保持在服务级别,而不是使组件混乱,视图不需要知道何时需要更新状态,而只需知道服务。它还确保一切按正确的顺序进行,并且订阅由switchMap运算符在内部进行管理,因此只有一个活动。您将需要诸如错误处理程序之类的东西,您可以在此方案中添加distinctUntilChanged()debounceTime()或任何其他内容,以便您拥有更大的灵活性。