我有一个订阅,该订阅将获取状态为“待定-已验证-已完成”的总体行的“状态”,这些将在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()来更新行为主题。它是否正确?我以为只要有变化,一次订阅就能使发射的值恢复原状?作为“活动流”。
答案 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()
或任何其他内容,以便您拥有更大的灵活性。