Rx js / Angular 8: HTTPHandler не срабатывает при вызове Subscription.unsubscribe () - PullRequest
1 голос
/ 05 февраля 2020

Мне нужно unsubscribe во время разговора, но когда я это делаю, HttpResponse нет. Это проблема для меня, так как я также использую перехватчик http, чтобы поймать, когда я должен показать значок загрузки или нет.

Так что в моем указанном c компоненте у меня есть это:

 if (this.testSubscription)
    this.testSubscription.unsubscribe();  // Stop original http request when calling getTestDetails with other parameters
  this.testSubscription = this.getTestDetails(param1, param2);

И мой перехватчик:

 intercept(request: HttpRequest<any>, next: HttpHandler) {
this.totalRequests++;
console.log(' intercept totalRequests: ', this.totalRequests);
this.loadingService.isLoading.next(true);
return next.handle(request).pipe(
  tap(res => {
    if (res instanceof HttpResponse) {
    //  I need to get here even when unsubscribing !!!!
        this.decreaseRequests();
    }
  }),
  catchError(err => {
    this.decreaseRequests();
    throw err;
  })
);
}

Так что я не совсем уверен, как я могу запустить свой метод перехвата, чтобы поймать это, когда я unsubscribe в подписке. Любые идеи приветствуются!

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Этот код выглядит смутно знакомым . : D

Как указал @martin, вы можете использовать оператор finalize. На самом деле, я провел некоторое тестирование и обнаружил, что вам даже не нужен оператор tap для обработки всех вариантов использования:

return next.handle(request).pipe(
  finalize(() => {
    this.totalRequests--;
    if (this.totalRequests === 0) {
      console.log('set loading false');
    }
  })
);

Я обновил исходный ответ, чтобы отразить эту информацию .

PS: Решение, которое вы придумали, может иметь ошибку в случае ошибки. Если у вас есть два незавершенных запроса, и один из них завершается с ошибкой, в то время как другой все еще выполняется, вы будете запускать decreaseRequests() дважды (один из оператора catchError и один из finalize), что установит загрузку в false хотя еще есть другой запрос, ожидающий рассмотрения.

0 голосов
/ 05 февраля 2020

Благодаря комментариям я смог решить мою проблему. Я изменил свой перехватчик на:

  intercept(request: HttpRequest<any>, next: HttpHandler) {
this.totalRequests++;
this.loadingService.isLoading.next(true);
return next.handle(request).pipe(
  tap(res => {
  //Removed code here
  }),
  catchError(err => {
    this.decreaseRequests();
    throw err;
  }),
  finalize(() => {
    if(this.totalRequests > 0){
      this.decreaseRequests();
  }  }
  )
);

}

Я тщательно его проверил и, похоже, он работает для моих целей.

...