Почему async pipe в Angular не работает с геттером, который возвращает Promise?

В Angular, async pipe используется для удобного обращения к асинхронным значениям. Она автоматически подписывается на Observable или Promise и обновляет представление, когда значение изменяется.

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

Суть проблемы заключается в том, что async pipe ожидает, что значение будет Observable, который может быть автоматически отписан, когда компонент уничтожается. Однако, Promise не может быть автоматически отписан, потому что он не имеет понятия подписки или отписки. Поэтому async pipe не может надежно работать с геттерами, возвращающими Promise.

Решением этой проблемы может быть использование асинхронных Pipe, таких как |async. Асинхронные Pipe предназначены специально для работы с асинхронными значениями, включая Promise. Они выполняют обратный вызов и обновляют представление, когда Promise разрешается или отклоняется.

Вот как может выглядеть код, который решает эту проблему:

HTML:
{{ myGetter | async }}

Компонент:
public myGetter: Promise<any>;

ngOnInit() {
this.myGetter = this.getData();
}

private async getData() {
return await this.myService.getSomeData();
}

Теперь, при каждом изменении значения Promise, представление будет обновляться автоматически. Обратите внимание, что мы используем ключевое слово async в определении метода getData(), чтобы использовать оператор await для ожидания разрешения Promise.

В заключение, async pipe не работает с геттерами, возвращающими Promise, из-за различий в обработке синхронного и асинхронного кода. Чтобы решить эту проблему, вы можете использовать асинхронные Pipe или изменить код таким образом, чтобы геттер возвращал Observable вместо Promise.