Я использую Angular 7 и создаю веб-приложение, извлекающее данные из конечной точки REST-API. Пользователи помещают свою строку поиска в общее поле formControl
, которое наблюдается. Если значение изменяется в поле ввода, HTTP-запрос отправляется конечной точке API. Наконец я получаю http-ответ как заметное, на которое я могу подписаться. Но результат запроса также может содержать более 100 элементов. Затем конечная точка API отправляет СЛЕДУЮЩУЮ ссылку на вторую страницу и т. Д. (Разбиение на страницы в конечной точке API).
Моя проблема сейчас, я не могу найти правильный способ наблюдать поле ввода поиска и просматривать все СЛЕДУЮЩИЕ страницы, которые я получаю от конечной точки API. Отдельно это работает как шарм.
Кто-нибудь имеет хорошую практику для моего варианта использования?
Мой файл компонента:
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» отсутствует в типе «Подписка».
UPDATE:
Сейчас я немного дальше, потому что я понял, что мне нужно объединить / объединить последовательные входящие наблюдаемые в сервисе (предоставляемые циклом).
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
я получаю по подписке только результат последнего ответа. Но я также хочу получить все ответы, полученные ранее и объединенные в одно значение.
Кто-нибудь знает, как должны выглядеть возвраты в операторе?
UPDATE:
Обновление кода, проблема с удаленным массивом (ApiDataResponse[]
-> ApiDataResponse
)