angular - Angular 在取消订阅时不会取消包装的 HTTP 请求
问题描述
更新:为什么你不能只使用或返回内置的
HttpClient
?因为我们必须拦截响应。
我们有一个HttpService
包装了HttpClient
angular 提供的内容。它用于应用标头/授权并对响应执行一些操作(......就像拦截器 - 我们走这条路是因为当时拦截器不在 Angular 中)。
我们的 HttpService 非常接近
HttpClient
并且有类似的方法,比如GET
,POST
等等。我们将GET
在这里作为一个例子。
我意识到,在取消订阅这些方法时,real HttpClient
取消了请求,而wrapped HttpService
没有取消了请求。在 Stackblitz 上查看此演示
所以,我的问题是:如何强制取消取消订阅的请求?或者,我的实施是否 Observable.create
错误(见下文)?
下面是一个关于 GET 的例子(实际代码做的更多):
@Injectable()
export class HttpService {
constructor(private http: HttpClient) {}
public get<T>(url: string): Observable<any> {
return Observable.create(observer => {
this.http.get<T>(url).subscribe(
response => {
// some other things
observer.next(response);
},
error => observer.error(error),
() => observer.complete());
});
}
}
解决方案
传递给 create 函数的函数应该包含拆解逻辑。注意它是如何在其文档中声明的:
create(onSubscription: function(observer: Observer): TeardownLogic): Observable
相关的部分是TeardownLogic:
不带参数的函数。当创建的 Observable 的消费者调用 unsubscribe 时,该函数将被调用
所以你的代码应该看起来更像这样:
public get<T>(url: string): Observable<any> {
return Observable.create(observer => {
let subs = this.http.get<T>(url).subscribe(
response => {
// some other things
observer.next(response);
},
error => observer.error(error),
() => observer.complete());
return () => {
// Your own tear down logic here and then:
subs.unsubscribe();
};
});
}
推荐阅读
- javascript - 如何使用 vanilla JS 向下拉列表动态添加更多元素
- reactjs - 如何在 Typescript React Native 项目中使对等依赖成为条件
- reactjs - 如何使用 if 语句动态更改 Material UI 对话上的标题文本?
- php - 如何简化这个复合 php if/else 语句
- sql - 分组依据后如何进一步对列中的项目进行分组
- numpy - 如何添加两个部分重叠的 numpy 数组并扩展非重叠部分?
- django - Django 基于类的视图中的条件访问和直接用户
- flutter - 有没有办法解决我的 api 请求问题?
- python - Pygame 的大多数关键输入都不起作用,例如(w、a、s、d)。只有箭头键似乎在工作
- scala - 在 Spark 集群中分发 FlatMap