angular - switchMap 没有取消以前的请求
问题描述
我正在实现和自动完成搜索功能。我希望使用取消以前的请求switchMap()
。我遵循了多个指南,但它们似乎都不起作用。
触发此主题时我得到了结果,但是当我查看网络选项卡时,之前的任何 api 调用都没有被取消。它只是说“待定”。
这是代码:
filterFolders$: Subject < string > = new Subject<string>();
filterFolderSubscription = this.filterFolders$.pipe(
switchMap((text) => this.folderService.searchFolders(<any>{ searchedName: text }))
)
.subscribe(res => {
this.filteredFolders = res.items;
})
filterFolders(value: string){
if (value != '') {
this.isFilterUpdating = true;
this.filterFolders$.next(value);
}
}
folderService.searchFolders()
返回一个可观察的。
这是searchFolders
它从 swagger 自动生成的方法。
我也尝试过以HttpClient
这种方式使用和调用 api。但结果是一样的。
searchFolders(input: SearchFolderDto | null | undefined): Observable<ListResultDtoOfFolderAccessInstanceDto> {
let url_ = this.baseUrl + "/api/services/app/Folder/SearchFolders";
url_ = url_.replace(/[?&]$/, "");
const content_ = JSON.stringify(input);
let options_ : any = {
body: content_,
observe: "response",
responseType: "blob",
headers: new HttpHeaders({
"Content-Type": "application/json",
"Accept": "application/json"
})
};
return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_ : any) => {
return this.processSearchFolders(response_);
})).pipe(_observableCatch((response_: any) => {
if (response_ instanceof HttpResponseBase) {
try {
return this.processSearchFolders(<any>response_);
} catch (e) {
return <Observable<ListResultDtoOfFolderAccessInstanceDto>><any>_observableThrow(e);
}
} else
return <Observable<ListResultDtoOfFolderAccessInstanceDto>><any>_observableThrow(response_);
}));
}
protected processSearchFolders(response: HttpResponseBase): Observable<ListResultDtoOfFolderAccessInstanceDto> {
const status = response.status;
const responseBlob =
response instanceof HttpResponse ? response.body :
(<any>response).error instanceof Blob ? (<any>response).error : undefined;
let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }};
if (status === 200) {
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
let result200: any = null;
let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
result200 = resultData200 ? ListResultDtoOfFolderAccessInstanceDto.fromJS(resultData200) : new ListResultDtoOfFolderAccessInstanceDto();
return _observableOf(result200);
}));
} else if (status !== 200 && status !== 204) {
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
return throwException("An unexpected server error occurred.", status, _responseText, _headers);
}));
}
return _observableOf<ListResultDtoOfFolderAccessInstanceDto>(<any>null);
}
解决方案
推荐阅读
- git - 我应该如何让我的拉取请求分支保持新鲜?
- angularjs - Angular JS 1.5 模块控制器查询(?)
- android - 带有 VS (Xamarin) 签名的 APK 的 PlayStore 出错
- c - C 回调函数的抽象 Fortran 接口是否需要 bind(C) 属性?
- corda - Corda 4 - 单方交易未能提交到 Ledger
- swift - 如何获得 UTC 和 iPhone - Swift 4.2 之间的时区偏移?
- fortran - C=AA'B 的快速矩阵乘法循环
- c# - EntityFremework:可以在哪里优化这个之前的选择吗?
- c# - 初始化 Blazor 组件中的对象
- c# - C# MVC 在模型执行后停止