У меня есть кнопка на моей веб-странице, при нажатии которой выполняется вызов http api. Требуется некоторое время, чтобы получить ответ и отразить его на странице. Итак, есть ли способ отменить в полете ожидающие HTTP-запросы, чтобы избежать нескольких вызовов API, если пользователь нажимает его несколько раз, что может привести к несогласованности данных?
Как отменить в полете ожидающие вызовы HTTP API?
Ответы (3)
Вы когда-нибудь рассматривали сценарий, в котором вам не разрешено отключать кнопку.
В. Что дальше?
А. Пользователь по-прежнему может нажимать кнопку.
Но в таком сценарии вы не хотите делать второй вызов (учитывая, что первый вызов API еще не завершен). ExhaustMap автоматически отменяет второй вызов, если выполняется первый вызов. В этом вся прелесть выхлопной карты.
Для такого сценария используется exhaustMap из RXJS. полезный.
Прочитайте эту замечательную статью, чтобы лучше понять ее
Фиктивный код
fromEvent(this.saveButton.nativeElement, 'click')
.pipe(
exhaustMap(() => this.saveCourse(this.form.value))
)
.subscribe();
ИЛИ switchMap может быть удобен, когда у вас есть один запрос, и вдруг приходит второй запрос, поэтому он отменяет первый запрос и запускает процесс для второго.
fromEvent(this.saveButton.nativeElement, 'click')
.pipe(
swtichMap(() => this.saveCourse(this.form.value))
)
.subscribe();
Это зависит от сценария, применимого к вашему приложению.
swtichMap
может пригодиться для этого.
- person micronyks; 08.07.2020
создать атрибут для отключенной кнопки.
isDisabled:boolean=false;
при нажатии меняется на true
this.isDisabled=true;
после того, как вы получили данные в подписке, снова измените значение на false
this.isDisabled=false;
в html привязать его к кнопке
[disabled]="isDisabled"
Вы можете отписаться от запроса:
@Component({ /* ... */ })
export class AppComponent {
/* ... */
private request;
search() {
if(request){
request.unsubscribe();
}
this.request = this.searchService.search(this.searchField.value)
.subscribe(
//...
);
}
}