Как установить конфигурацию тайм-аута для 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
}
});