Повторите попытку для rxjs в nestjs - PullRequest
0 голосов
/ 18 октября 2019
import { HttpService, Injectable } from '@nestjs/common';
import { retry } from 'rxjs/operators';

@Injectable()
export class XXXService {
  constructor(private http: HttpService) {}

  predictAll() {
    return this.http
      .post('https://xxxxx/xxxxx')
      .pipe(retry(5));
  }
}

затем у меня есть следующий код для подписки из вышеприведенной наблюдаемой

import { Inject, Injectable } from '@nestjs/common';
import { XXXService } from '@api/services/XXX.service';

@Injectable()
export class YYYService {

  constructor(
    private readonly xxxService: XXXService
  ) {
    this.predictAll();
  }

  async predictAll() {
    await this.xxxService.predictAll().subscribe(
      ({ data }) => {
        console.log(data);
      },
      err => {
        console.log('error');
      }
    );
  }
}

, затем я попытался отключить интернет-соединение. После проверки «ошибка» печатается только один раз в консоли, котораяозначает, что моя наблюдаемая не повторяется вообще. Что-то не так, что я делаю.

1 Ответ

0 голосов
/ 18 октября 2019

Вас смущает ожидаемое поведение повтора.

С оператором retry он не будет пересылать ошибки вашему обработчику ошибок, пока не будут исчерпаны все попытки повторения. Так что это повторная попытка, просто ваши ожидания не соответствуют тому, как будут регистрироваться ошибки. Если вы хотите регистрировать ошибки по мере их возникновения до повторных попыток, вам необходимо использовать tap для создания побочного эффекта до retry:

source$.pipe(
   tap({ error: err => console.log('error: ', err.message) }),
   retry(5),
)
.subscribe({
  next: value => console.log(value),
  error: err => console.log('only fires once ', err.message),
});

Не связано:Вы делаете что-то странное с async / await.

Кроме того, await source$.subscribe() не имеет смысла, потому что при этом ваша функция просто вернет Promise<Subscription>. subscribe не возвращает Promise. Возможно, вы ищете Observable.prototype.forEach(), однако, предупреждаем, с помощью которого можно отказаться от отмены, поскольку он не возвращает Subscription для отказа от подписки.

Я бы рекомендовал не использовать async /await в данном случае.

Надеюсь, это поможет.

...