Как установить конфигурацию тайм-аута для lastValueFrom() с использованием RxJS 7 в Angular 13?

Цитата от команды разработчиков RxJS:

Чтобы исправить все эти проблемы, мы решили отказаться от рекомендаций и представить две новые вспомогательные функции для преобразования в промисы.

Используйте одну из двух новых функций

В качестве замены устаревшей toPromise() метод, вы должны использовать одну из двух встроенных функций статического преобразования firstValueFrom или lastValueFrom....

В моем случае я отправляю запрос на получение на сервер, чтобы проверить, доступен ли сервер или нет. Основная функция (в данном случае ngOnInit()) не пойдет дальше, пока не появится ответ HTTP или ошибка.

В этой части статьи они предлагают добавить timeout к lastValueFrom() функция, которую нужно добавить как конфиг config?: LastValueFromConfig<D>.

Мой код:

          let something = lastValueFrom(this.http.get<resultDTO> 
    ('/api/account/test'),).then(
          res => {
            this.note = (res.data);
          }
    );

Как мне установить эту конфигурацию и передать ее функции?

1 ответ

The оператор должен быть добавлен в HTTP-запрос, а не в Promise from lastValueFrom.

      let something = lastValueFrom(
  this.http.get<resultDTO>('/api/account/test').pipe(
    timeout(5000)      // <-- HTTP request will error out if no response for 5 seconds
  )
).then(res => {
  this.note = (res.data);
});

The LastValueFromConfigаргумент на данный момент (RxJS v7) имеет только одно значение.

      export interface LastValueFromConfig<T> {
  defaultValue: T;
}

Это не имеет ничего общего с timeoutповедение наблюдаемого.

Итак, в вашем случае вы можете сделать

      let something = lastValueFrom(
  this.http.get<resultDTO>('/api/account/test').pipe(
    timeout(5000)      // <-- HTTP request will error out if no response for 5 seconds
  ),
  { defaultValue: { data: ''} }  // <-- default value to be used
).then(res => {
  this.note = (res.data);
});

Как говорится, это один из тех случаев, когда я бы сказал, что нет внутренней необходимости преобразовывать Observable в Promise. Вы могли бы просто обойтись только наблюдаемым

      this.http.get<resultDTO>('/api/account/test').pipe(
  timeout(5000)      // <-- HTTP request will error out if no response for 5 seconds
).subscribe({
  next: (res: resultDTO) => {
    this.note = res.data;
  },
  error: (error: any) => {
    // handle errors
  }
});
Другие вопросы по тегам