У меня есть угловая реактивная форма , которая делает простой запрос GET.Если, например, я должен получить какую-то ошибку HTTP.Наблюдаемое todo$
завершено. Я больше не могу изменить параметры поиска и нажмите, чтобы повторить поиск.Я сделал демо stackblitz , в демо я добавил свою подписку внутри инициализатора и, если в потоке есть ошибка, я ее ловлю.После того, как я поймаю его, я снова вызываю инициализатор.Это работает, но кажется неправильным способом обработки ошибок.
Я настроил форму, чтобы можно было отменять предыдущие запросы HTTP.
export class AppComponent implements OnDestroy {
todos;
loading = false;
useFakeURL = false;
todoSub$: Subscription;
todo$: BehaviorSubject < string > = new BehaviorSubject < string > ('');
@ViewChild('searchInput') searchInput: ElementRef;
constructor(private provider: ExampleService) {
this.init();
}
ngOnDestroy() {
this.todoSub$.unsubscribe();
}
search() {
const value = this.searchInput.nativeElement.value;
this.todo$.next(value);
this.useFakeURL = !this.useFakeURL;
}
private init(): void {
this.todoSub$ = this.todo$.pipe(
filter(val => !!val),
tap(() => {
this.loading = true;
}),
switchMap(() => this.provider.query(this.todo$.getValue(), this.useFakeURL)),
catchError(error => {
this.todo$.next('');
this.init();
return of([]);
}),
)
.subscribe(
todos => {
this.loading = false;
this.todos = todos;
},
err => {
this.loading = false;
this.todos = err;
}
);
}
}
export class ExampleService {
constructor(private http: HttpClient) {}
query(todo, useFakeURL: boolean) {
if (todo === 'all') {
todo = '';
}
const url = useFakeURL ? 'poop' : `https://jsonplaceholder.typicode.com/todos/${todo}`;
return this.http.get(url);
}
}
{{todo | json}}
{{todos |}} JSON... ЗАГРУЗКА