更改页面时取消挂起的 HTTP 请求
我们有一个 Angular 服务,它有一个昂贵的 HTTP 查询,3 个不同的消费者可以访问。每个消费者都可以随时修改此查询,发出新请求,并且所有其他消费者都必须使用新数据进行更新。
因为 HTTP 订阅在完成后立即关闭,所以我们使用带有行为主体的内部可观察模式来保持消费者的连接(见下文)。
那么问题在于,当用户更改页面时,当前未决的 HTTP 响应无法取消。
通常我认为在后台丢弃 HTTP 请求不会有太大的问题......但除了它是一项昂贵的操作之外,我发现在用户返回后是否确实解决了待处理的响应到页面,它将使用旧查询的数据更新消费者。
没有布埃诺。
服务电话
private dataSubject = new BehaviorSubject<MyData>(...);
public data$ = this.dataSubject.asObservable();
...
getData(): Observable<MyData> {
if (this.dataSubject)
return this.data$;
} else {
const http$ = this.http.post(...))
.pipe(map(response => response as MyData),
takeUntil(this.unsubscribe$)); // see tearDown() below
http$.subscribe(
(availableDevices: MyData) => {
this.dataSubject.next(availableDevices);
}
);
return this.data$;
}
}
我试图在每个消费者在 ngDestroy() 期间调用的服务中创建一个拆卸方法,但除非我完成了流,否则它不起作用。但是那时,当用户返回页面时,我无法再次重新启动流。
tearDown(): void {
this.unsubscribe$.next();
this.unsubscribe$.complete();
// this.dataSubject.next(null);
// this.dataSubject.complete(); -- breaks
}
我绝不是 RXJS 专家,所以请随时指出我的整体设计是否错误。我怀疑我应该使用switchMap()或share来防止两个消费者发出相同的请求;但由于这种可观察到的模式是半热的,我不确定正确的做法是什么。更不用说取消它了。
任何和所有的帮助将不胜感激。