Отписаться не работает на интервале подписки в Typescript - PullRequest
1 голос
/ 26 сентября 2019

Я подписываюсь на интервал, и по ошибке интервал должен быть отписан.Также на нгДестрой это стоит отписать.Однако, когда я перехожу к другому компоненту на моем веб-сайте, я все еще вижу, где он опрашивает сервер.

Использование rxjs 6.2.1

Вот мой код

private polling: Subscription;

ngOnDestroy() {
    if(this.polling){    
    this.polling.unsubscribe();
    }
  }

 loadContacts(){
    this.polling = interval(10000)
                .subscribe((val) => {
                  this.resourceService.getQueryUserPresence(this.contacts[0].Email).subscribe((response) => {
                    console.log('polling for ' + fullName);                    
                  }, (error: any)=> {
                    console.log('Error Getting Status:  ' + error)
                    if(this.polling){
                      this.polling.unsubscribe();
                      }
                  });
                }, (error: any)=> {
                  console.log('Error polling:  ' + error)
                  if(this.polling){
                    this.polling.unsubscribe();
                    }
                })
}

1 Ответ

1 голос
/ 26 сентября 2019

Из того, что я могу понять из этого ТАКОГО сообщения , нет необходимости отписываться после того, как наблюдаемое выдает ошибку или завершает .

То, что я считаю неправильным в вашем коде, заключается в том, что вы подписываетесь на этот запрос в обработчике первой подписки *1012*, поэтому вы не сможете увидеть ошибку в второй обратный вызов .

Это похоже на что-то вроде этого:

interval(1000)
 .subscribe(
  () => {}, 
  () => { console.log('I will never be able to catch an error just from an observable that emits values at certain interval!') }
)

Один из способов решить эту проблему - поместить вызов API в конвейерный оператор , такой как switchMap, mergeMap, exhaustMap, concatMap, в зависимости от вашего случая использования.
(Вышеупомянутые операторы также называются операторами высокого порядка ).

this.polling = interval(1000)
 .pipe(
  mergeMap(() => this.resourceService.getQueryUserPresence(this.contacts[0].Email))
 )
 .subscribe(
  response => console.log('polling operation successful!', response),
  err => console.log('error caught from the API call!', err)
 )

РЕДАКТИРОВАТЬ

начать опрос, но входить в вызов webAPI можно, только если this.contacts.length> 0

Я думаю, вы можете использовать оператор skipWhile.

this.polling = interval(1000)
 .pipe(
  skipWhile(() => this.contacts.length === 0),
  mergeMap(() => this.resourceService.getQueryUserPresence(this.contacts[0].Email))
 )
 .subscribe(
  response => console.log('polling operation successful!', response),
  err => console.log('error caught from the API call!', err)
 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...