RxJS (Reactive Extensions for JavaScript) — это библиотека для реактивного программирования, которая стала неотъемлемой частью Angular. Вот основные причины её использования:
Работа с асинхронными операциями:
Реактивные формы:
Маршрутизация (Router):
State management:
Работа с событиями:
Observable — это фундаментальная концепция RxJS, представляющая ленивую коллекцию значений, которые могут приходить с течением времени.
import { Observable } from 'rxjs';
// Создание простого Observable
const observable = new Observable(subscriber => {
subscriber.next('Hello');
subscriber.next('World');
setTimeout(() => {
subscriber.next('Async');
subscriber.complete();
}, 1000);
});
// Подписка
const subscription = observable.subscribe({
next: value => console.log(value),
error: err => console.error(err),
complete: () => console.log('Completed')
});
// Отписка (обычно в ngOnDestroy)
subscription.unsubscribe();
// Пример комбинации запросов
forkJoin([
this.http.get('/api/users'),
this.http.get('/api/posts')
]).subscribe(([users, posts]) => {
this.users = users;
this.posts = posts;
});
// Поиск с debounce
this.searchControl.valueChanges.pipe(
debounceTime(300),
distinctUntilChanged(),
switchMap(term => this.searchService.search(term))
).subscribe(results => this.results = results);
Observable:
Observer:
Subscription:
Operators:
Subject:
// Пример использования Subject
const subject = new Subject<number>();
subject.subscribe(value => console.log('Subscriber A:', value));
subject.subscribe(value => console.log('Subscriber B:', value));
subject.next(1);
subject.next(2);
this.http.get('/api/data').pipe(
map(response => response.data),
catchError(error => {
console.error('Error:', error);
return of([]);
})
).subscribe(data => this.data = data);
this.form.valueChanges.pipe(
debounceTime(500),
distinctUntilChanged()
).subscribe(values => this.saveDraft(values));
this.route.params.pipe(
switchMap(params => this.loadUser(params['id']))
).subscribe(user => this.user = user);
RxJS и Observable — это мощные инструменты, которые Angular использует для:
Понимание этих концепций критически важно для современной Angular разработки, так как они используются практически во всех аспектах фреймворка.