Асинхронные пайпы (async pipe) в Angular предназначены для упрощения
работы с асинхронными данными, такими как Observable и
Promise. Основная задача асинхронного пайпа —
автоматическая подписка на поток данных и обновление представления при
получении новых значений, а также автоматическая отписка при уничтожении
компонента, что предотвращает утечки памяти.
Асинхронный пайп используется в шаблонах Angular с помощью синтаксиса
{{ observable$ | async }}. Его работа включает три ключевых
шага:
Подписка на поток данных Если значение выражения
является Observable или Promise, пайп
автоматически подписывается на него и ожидает поступления
данных.
Обновление шаблона Как только приходит новое значение, пайп обновляет отображаемое значение в DOM, синхронизируя представление с асинхронным источником данных.
Отписка при уничтожении Когда компонент, использующий пайп, уничтожается, пайп автоматически выполняет отписку от всех потоков, предотвращая утечки памяти.
Наиболее частый сценарий применения — работа с потоками
Observable из библиотеки RxJS. Рассмотрим пример:
import { Component } from '@angular/core';
import { Observable, of } from 'rxjs';
import { delay } from 'rxjs/operators';
@Component({
selector: 'app-async-example',
template: `
<div>
Данные: {{ data$ | async }}
</div>
`
})
export class AsyncExampleComponent {
data$: Observable<string> = of('Привет, Angular!').pipe(delay(2000));
}
В этом примере:
data$ — поток, который через 2 секунды выдаёт
строку.| async, что позволяет
автоматически подписаться на поток и отобразить значение после его
получения.Асинхронный пайп также поддерживает Promise. Пример:
@Component({
selector: 'app-promise-example',
template: `
<div>
Результат промиса: {{ promiseData | async }}
</div>
`
})
export class PromiseExampleComponent {
promiseData: Promise<string> = new Promise(resolve => {
setTimeout(() => resolve('Данные из промиса'), 3000);
});
}
Здесь пайп:
Асинхронный пайп особенно полезен при работе с компонентами,
использующими RxJS для управления состоянием, например,
через BehaviorSubject или ReplaySubject. Он
позволяет избавиться от ручного подписывания и вызовов
unsubscribe():
@Component({
selector: 'app-state-example',
template: `
<div *ngIf="state$ | async as state">
Состояние: {{ state }}
</div>
`
})
export class StateExampleComponent {
private stateSubject = new BehaviorSubject<string>('Начальное состояние');
state$ = this.stateSubject.asObservable();
updateState(newState: string) {
this.stateSubject.next(newState);
}
}
Использование *ngIf="state$ | async as state" позволяет
одновременно подписаться на поток и получить локальное имя переменной
для удобной работы в шаблоне.
Автоматическая подписка и отписка Устраняет необходимость вручную управлять жизненным циклом подписок.
Упрощение шаблонов Сокращает код, так как подписка и передача данных в представление выполняются одной конструкцией.
Повышение читаемости и безопасности кода Минимизируется риск утечек памяти и ошибок при работе с асинхронными потоками.
Совместимость с Angular Change Detection Пайп
автоматически уведомляет систему обнаружения изменений при получении
нового значения, обновляя DOM без дополнительных вызовов
ChangeDetectorRef.
let) через *ngIf или
*ngFor.null, поэтому в шаблонах часто
используют условный рендеринг через *ngIf.Асинхронный пайп можно использовать вместе с другими пайпами для преобразования данных. Например:
<div>
{{ numbers$ | async | json }}
</div>
Здесь сначала происходит получение массива из Observable, а затем его
преобразование в JSON-строку с помощью стандартного json
пайпа.
async для всех асинхронных потоков в
шаблоне, чтобы уменьшить количество ручных подписок.RxJS
операторами, чтобы логика оставалась в компоненте, а шаблон только
отображал результат.