Асинхронный вызов возвращается после вызова onDestroy - PullRequest
0 голосов
/ 11 марта 2020

У меня есть асинхронный серверный вызов, который настроен так. В ответ на вызов устанавливает таймер для повторного вызова через 30 секунд. Проблема возникает, если пользователь уходит со страницы. Несмотря на то, что this.stopTimer () был вызван, если ответ возвращается после ухода со страницы, l oop просто продолжается. Как я могу предотвратить вызов следующего this.startTimer () после вызова ngOnDestroy ()?

ngOnInit() {
    this.doSomething();
}

ngOnDestroy(){
    this.stopTimer();
}

doSomething() {
         var me = this;

        this.stopTimer();
        this.service.getStuff().subscribe(
            (response: any) => {

                ...do stuff
                this.startTimer();

            }
        )
    }

startTimer() {
    var me = this;
    clearTimeout(me.timeoutHandle);
    me.timeoutHandle = setTimeout(function () {
        me.doSomething();
    }, 30000);
}

stopTimer() {
    var me = this;
    clearTimeout(me.timeoutHandle);
    me.timeoutHandle = null;
}

1 Ответ

1 голос
/ 12 марта 2020

Вы можете рассмотреть этот подход.

destroy$ = new Subject<boolean>();

ngOnInit() {
  this.startPolling();
}

ngOnDestroy(){
  this.destroy$.next(true);
}

startPolling() {
  this.service.getStuff().pipe(
    tap(response => {
      //... do stuff
    }),
    delay(30 * 1000),  // wait for 30s before retry
    repeat(),
    takeUntil(this.destroy$),
  ).subscribe();
}

Обратите внимание, что в этом случае, если для возврата ответа бэкэнду потребуется некоторое время, с момента получения ответа начнется задержка в 30 с.

Наблюдаемый destroy$ предлагает вам возможность отменить опрос из-за действий пользователя или после уничтожения компонента.

...