【发布时间】:2019-01-12 14:10:18
【问题描述】:
我正在使用 Angular 7 并构建一个从 REST-API 端点检索数据的 web 应用程序。用户将他们的搜索字符串放入一个常见的formControl 字段中,该字段会被观察到。如果输入字段中的值发生变化,则会向 API 端点发送一个 http 请求。最后,我将 http 响应作为我可以订阅的 observable 获得。但是查询结果也可以有100多个项目。然后 API 端点将 NEXT 链接发送到第二页,依此类推(API 端点分页)。
我现在的问题是,我找不到正确的方法来观察搜索输入字段并遍历从 API 端点获得的所有 NEXT 页面。单独使用它就像一个魅力。
有人对我的用例有好的做法吗?
我的组件文件:
export class GeomapComponent implements OnInit {
searchTerm = new FormControl();
constructor(private geomapService: GeomapService) { }
ngOnInit() {
this.searchTerm.valueChanges.pipe(
debounceTime(400),
distinctUntilChanged(),
switchMap(term => this.geomapService.retrieveApi(term))
).subscribe(data => {
if (data['results']) {
......
}
}
}
}
我的服务文件:
export class GeomapService {
retrieveUrl = new Subject<string>();
constructor(private http: HttpClient) { }
public retrieveApi(searchTerm: string): Observable<ApiDataResponse> {
this.retrieveUrl.next(baseApiUrl + '?q=' + searchTerm);
return this.retrieveUrl.pipe(
switchMap(url => this.sendRequest(url)),
).subscribe(data => {
if (data['next']) {
this.retrieveUrl.next(data['next']);
}
});
}
public sendRequest(url: string, httpOptions = {}): Observable<ApiDataResponse> {
return this.http.get<ApiDataResponse>(url);
}
}
不幸的是,我收到以下错误:
TS2322:“订阅”类型不可分配给“可观察”类型。 “订阅”类型中缺少属性“_isScalar”。
更新: 现在我走得更远了,因为我意识到我必须在服务中合并/合并顺序传入的 observables(由循环提供)。
public requestApi(requestUrl: string): Observable<ApiDataResponse> {
return this.sendRequest(requestUrl).pipe(
mergeMap(result => {
if (result['next']) {
return this.requestApi(result['next']);
} else {
return of(result);
}
})
);
}
尽管如此,我仍然坚持使用正确的组合/转换运算符,因为在这个阶段,mergeMap 我订阅了只是最后一个响应的结果。但我也希望获得之前收到的所有回复并将其合并为一个值。
有人知道运算符中的返回应该是什么样子吗?
更新:
代码更新,移除数组问题 (ApiDataResponse[] --> ApiDataResponse)
【问题讨论】:
-
在你的代码中
data的类型是ApiDataResponse[],对吧?!你怎么会有data['next']和data['result']属性在一个数组上? -
@fridoo:
data['next']和data['result']是 API 响应的值。 -
是的,我是这么认为的。但是你总是返回/switchMap/mergeMap 到an
Observable<ApiDataResponse[]>。所以你的data或result变量将是ApiDataResponse[]类型。 -
@fridoo:您对提到的数组问题是正确的。我修好了它。谢谢。然而,这不是我的问题的解决方案(通知其他人)。
-
能否更新您问题中的代码。
标签: angular rxjs httpclient