Как отменить запросы в случае их срабатывания с помощью forkJoin Rx js, Angular - PullRequest
0 голосов
/ 29 мая 2020

У меня есть набор из 6 HTTP-запросов на получение, которые я должен сделать независимо от их последовательности при нажатии кнопки. Я использую forkJoin для этой цели

<button click="getData()">Get Data</button>


getData(){

  const ids = [1,2,3,4,5,6];

  const obs = ids.map(id => this.http.get('<my url>/' + id)

  forkJoin(...obs).subscribe(res => console.log(res));

}

Если пользователь нажимает на кнопку несколько раз, есть ли способ отменить предыдущие незавершенные запросы и сделать только новые бесплатные sh вызовы на бэкэнд?

Я провел небольшое исследование и понял, что оператор switchMap помогает в отмене запросов, но я не уверен как я бы использовал его здесь.

Пожалуйста, помогите

Ответы [ 3 ]

2 голосов
/ 29 мая 2020
public subscription: Subscription;

getData(){

  const ids = [1,2,3,4,5,6];

  const obs = ids.map(id => this.http.get('<my url>/' + id)

  if(this.subscription){
     this.subscription.unsubscribe();
  }

  this.subscription = forkJoin(...obs).subscribe(res =>console.log(res))
}
0 голосов
/ 29 мая 2020

В этом ответе указано:

Большинство методов jQuery Ajax возвращают объект XMLHttpRequest (или эквивалентный), поэтому вы можете просто использовать abort() .

var xhr = $.ajax({
    type: "POST",
    url: "some.php",
    success: function(msg){
       alert("Done");
    }
});

//kill the request
xhr.abort()
0 голосов
/ 29 мая 2020

Я думаю, вы ищете оператор ExhaustMap

Старая версия ExhaustMap - это оператор flatMapFirst (), который передает данные из первого сопоставленного наблюдаемого объекта, и он только к следующему, когда он закончит отбрасывать все остальные наблюдаемые перед завершением.

...