Angular switchMap不取消以前的请求
我正在实现和自动完成搜索功能。我希望使用Angular switchMap不取消以前的请求,angular,rxjs,Angular,Rxjs,我正在实现和自动完成搜索功能。我希望使用switchMap()取消以前的请求。我遵循了多个指南,但似乎都不起作用 触发此主题时我会得到结果,但在查看“网络”选项卡时,之前的api调用均未被取消。它只是说“待定” 代码如下: filterFolders$: Subject < string > = new Subject<string>(); filterFolderSubscription = this.filterFolders$.pipe( switchMa
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的实现方式SwitchMap仅取消observable not http调用,如果设置了http,则无法执行该调用canceled@FanCheung我不这么认为。这段代码适用于我的其他应用程序。唯一的区别是它指向另一个api。在某些情况下,端点是否返回错误?@yevhenidovhaniuk是的。我试着反对我的另一个后端,但同样的问题出现了。因此,它与后端无关。
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);
}