RxJs Π’Π΅ΠΎΡΠΈΡ: Observable, Observer, Subscription, Pipe
Observable - ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° ΡΠΎΠ±ΡΡΠΈΠΉ Observer - ΡΠ»ΡΡΠ°ΡΠ΅Π»Ρ ΡΠΎΠ±ΡΡΠΈΠΉ, ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ ΡΠΎΠ±ΡΡΠΈΠΉ ΠΏΡΡΠ΅ΠΌ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ
Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ ΠΏΠΎΠ΄ ΡΠΎΠ±ΠΎΠΉ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° ΡΠΎΠ±ΡΡΠΈΠΉ Observable, Π½Π° ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ΄ΠΏΠΈΡΡΠ²Π°ΡΡΡΡ ΡΠ»ΡΡΠ°ΡΠ΅Π»ΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ. Π ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, ΡΠ°ΠΌΠΈ ΡΠ»ΡΡΠ°ΡΠ΅Π»ΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ
Promise ΡΠΆΠ΅ ΡΠ°ΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠΌ ΡΠΎΠ±ΡΡΠΈΡ. ΠΠ½ Π²ΡΠ·Π²Π°Π½ ΠΈ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ΄Π°ΡΡ Π»ΠΈΠ±ΠΎ ΠΎΡΠΈΠ±ΠΊΡ, Π»ΠΈΠ±ΠΎ ΡΡΠΏΠ΅ΡΠ½ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ. Π’Π°ΠΊ ΠΆΠ΅ Π½Π° Π½Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°ΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ then
, Π΅ΡΠ»ΠΈ Π±ΡΠ΄Π΅Ρ ΡΡΠΏΠ΅Ρ
ΠΈΠ»ΠΈ reject
, Π΅ΡΠ»ΠΈ Π²ΡΠ»Π΅Π·Π΅Ρ ΠΎΡΠΈΠ±ΠΊΠ°
Π£ Π½Π°Ρ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π΅ΡΡΡ ΡΡΠΈ Observable, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ Observer. Π’Π°ΠΊ ΠΆΠ΅ Observable ΠΌΠΎΠ³ΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡ Π΄ΡΡΠ³ Π΄ΡΡΠ³Π° ΡΠ΅ΡΠ΅Π· pipe
, ΡΡΠΎΠ±Ρ Π²ΡΠ·Π²Π°ΡΡΡΡ Π΄ΡΡΠ³ Π·Π° Π΄ΡΡΠ³ΠΎΠΌ
ΠΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΠΎΠ±ΡΡΠΈΡ Ρ ΠΎΠ±Π·ΡΡΠ²Π΅ΡΠ° ΡΠΎΠ²Π½ΠΎ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΎΠ½ Π½Π΅ Π·Π°ΠΊΠΎΠ½ΡΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ ΠΈΠ»ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Π·Π°ΠΏΡΠΎΡΠ°. ΠΠ°Π»ΡΡΠ΅ ΡΠΆΠ΅ ΡΠΎΠ±ΡΡΠΈΡ Π½Π΅ Π±ΡΠ΄ΡΡ Π΄ΠΎΡ ΠΎΠ΄ΠΈΡΡ Π΄ΠΎ ΠΎΠ±Π·ΡΡΠ²Π΅ΡΠ°.
Observer.next
- ΠΌΠ΅ΡΠΎΠ΄ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΡΠΎΠ±ΡΡΠΈΡ
Observer.error
- ΠΌΠ΅ΡΠΎΠ΄ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° ΡΠΎΠ±ΡΡΠΈΠΉ
Observer.complete
- ΠΌΠ΅ΡΠΎΠ΄ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ Π½Π° Π·Π°ΠΊΡΡΡΠΈΠΈ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° ΡΠΎΠ±ΡΡΠΈΠΉ
Pipe - ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° ΡΠΎΠ±ΡΡΠΈΡ Pipe ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ - ΡΠΈΡΡΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ°ΠΉΠΏΠ°, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°Π΄Π°ΡΡ ΡΠΎΡ ΠΆΠ΅ ΡΠΈΠ»ΡΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΎΡΡΠ΅ΠΈΠ²Π°ΡΡ Π½Π΅Π²Π°Π»ΠΈΠ΄Π½ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ
1. ΠΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ RxJS
ΠΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΈΠ΄Π΅Π΅ΠΉ ΡΠ°Π±ΠΎΡΡ RxJS ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠ° Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠ΅ ΡΠΎΠ±ΡΡΠΈΡ ΠΈ ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Π½ΠΈΡ .
ΠΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΡ ΡΠΎΠ·Π΄Π°ΡΠΌ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΡΠΈΠ³Π³Π΅ΡΠΈΡ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π½Π½ΡΠ΅ Π½Π° Π½Π΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°Π· Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ.
Π§Π΅ΡΠ΅Π· subscribe
ΠΌΡ ΠΏΠΎΠ΄ΠΏΠΈΡΡΠ²Π°Π΅ΠΌΡΡ Π½Π° ΡΠΌΠΈΡΡΠ΅Ρ ΡΠΎΠ±ΡΡΠΈΡ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ ΠΊΠΎΠ΄ ΡΠ°Π· Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ.
import { Component } from '@angular/core';
import { interval } from 'rxjs';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent {
constructor() {
const intervalStream$ = interval(1000);
intervalStream$.subscribe((value) => {
console.log(value);
});
}
}
2. ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΡΡΡΠΈΠΌΠΎΠ²
ΠΡΠ»ΠΈ ΠΌΡ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΈ ΠΎΡΠΊΠ»ΡΡΠ°ΡΡ ΡΡΡΠΈΠΌΡ, ΡΠΎ Ρ Π½Π°Ρ ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ Π°ΠΊΡΠΈΠ²Π½Ρ ΠΈ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΠΊΠΎΠΏΠΈΡΡΡΡ. ΠΡΠΎΡΠ»ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ, ΠΏΠΎΠΊΠ° ΡΡΡΠ°Π½ΠΈΡΠ° Π°ΠΊΡΠΈΠ²Π½Π°.
Π§ΡΠΎΠ±Ρ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ Π΄Π°Π½Π½ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΡ
ΡΠ°Π½ΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΡΡΠΈΠΌΠ° Π² ΠΏΠΎΠ»Π΅ Ρ ΡΠΈΠΏΠΎΠΌ Subscription
, ΡΡΠΎΠ±Ρ ΠΈΠΌΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΡΠΏΠΈΡΠ°ΡΡΡΡ ΠΎΡ ΡΡΡΠΈΠΌΠ° ΡΠ΅ΡΠ΅Π· unsubscribe()
import { Component } from '@angular/core';
import { interval, Subscription } from 'rxjs';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent {
sub: Subscription;
constructor() {
const intervalStream$ = interval(1000);
this.sub = intervalStream$.subscribe((value) => {
console.log(value);
});
}
stop() {
this.sub.unsubscribe();
}
}
ΠΠ½ΠΎΠΏΠΊΠ° Π±ΡΠ΄Π΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π½ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Π°
<div class='container'>
<h1>RxJS</h1>
<button class='btn' (click)='stop()'>Stop Interval</button>
</div>
Π ΡΠ΅ΠΏΠ΅ΡΡ ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»
3. ΠΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ
Π RxJS ΠΏΡΠΈΡΡΡΡΡΠ²ΡΠ΅Ρ ΠΎΠ³ΡΠΎΠΌΠ½ΠΎΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΡΠ°Π·Π½ΡΠΌΠΈ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΈ ΡΠ°ΠΌ ΡΡΡΠΈΠΌ
Π§Π΅ΠΉΠ½ pipe()
ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈ Π±ΡΠ΄ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π°Π΄ Π½Π°ΡΠΈΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ
ΠΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π² ΠΏΠ°ΠΉΠΏ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ Π΄Π²Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°, ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ :
filter
- ΡΠΈΠ»ΡΡΡΡΠ΅Ρ ΠΏΡΠΎΡ ΠΎΠ΄ΡΡΠΈΠ΅ Π΄Π°Π»ΡΡΠ΅ Π΄Π°Π½Π½ΡΠ΅map
- Π²ΠΈΠ΄ΠΎΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ Π΄Π°Π½Π½ΡΠ΅
import { Component } from '@angular/core';
import { interval, Subscription } from 'rxjs';
import { map, filter } from 'rxjs/operators';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent {
sub: Subscription;
constructor() {
const intervalStream$ = interval(1000);
this.sub = intervalStream$
.pipe(
filter((value) => value % 2 === 0),
map((value) => `Mapped ${value}`),
)
.subscribe((value) => {
console.log(value);
});
}
stop() {
this.sub.unsubscribe();
}
}
Π ΡΠ΅ΠΏΠ΅ΡΡ Ρ Π½Π°Ρ Π²ΡΡ ΠΎΠ΄ΡΡ Π² ΠΊΠΎΠ½ΡΠΎΠ»Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΡΠ½ΡΠ΅ Π·Π°ΠΌΠ°ΠΏΠ»Π΅Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅
4. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ²ΠΎΠ΅Π³ΠΎ ΡΡΡΠΈΠΌΠ°
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ²ΠΎΠΉ ΡΡΡΠΈΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠ»Π°ΡΡΠ° Observable
. ΠΠ½ΡΡΡΡ Π½Π΅Π³ΠΎ ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, Π²Π½ΡΡΡΠΈ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠ°
ΠΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ ΠΌΡ ΠΈΠΌΠ΅Π΅ΠΌ ΡΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°:
next
- ΡΡΠΈΠ³Π³Π΅ΡΠΈΡ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠ»Π»Π±Π΅ΠΊΠ° Π²Π½ΡΡΡΠΈsubscribe
complete
- ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ Π·Π°ΠΏΡΠΎΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ (ΠΈ ΡΡΠΈΠ³Π³Π΅ΡΠΈΡ ΡΡΠ΅ΡΠΈΠΉ ΠΊΠΎΠ»Π»Π±ΡΠΊΠ°)error
- Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ Π²Π½ΡΡΡΠΈ ΠΎΠ±Π·ΡΡΠ²Π΅ΡΠ° (ΠΈ ΡΡΠΈΠ³Π³Π΅ΡΠΈΡ Π²ΡΠΎΡΠΎΠΉ ΠΊΠΎΠ»Π»Π±ΡΠΊΠ°)
Π’Π°ΠΊ ΠΆΠ΅ ΠΌΠ΅ΡΠΎΠ΄ subscribe()
Ρ ΡΡΡΠΈΠΌΠ° ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΠΎ Π²ΡΠ·ΠΎΠ²Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΡΡΡΡ
ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ Π²Π½ΡΡΡΠΈ ΠΎΠ±Π·Π΅ΡΠ²Π΅ΡΠ°
import { Component } from '@angular/core';
import { Subscription, Observable } from 'rxjs';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent {
sub: Subscription;
constructor() {
const stream$ = new Observable((observer) => {
setTimeout(() => {
observer.next(1);
}, 1500);
setTimeout(() => {
observer.complete();
}, 1900);
setTimeout(() => {
observer.error('Something went wrong');
}, 2000);
setTimeout(() => {
observer.next(2);
}, 2500);
});
this.sub = stream$.subscribe(
(value) => console.log(`Next: ${value}`), // next
(error) => console.log(`Error: ${error}`), // error
() => console.log('Complete'), // complete
);
}
stop() {
this.sub.unsubscribe();
}
}
5. ΠΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Subject
ΠΠ»Π°ΡΡ Subject
ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΡΡΡΠΈΠΌ, ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΎΠΏΠΈΡΠ°ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π½Π°Π΄ Π΄Π°Π½Π½ΡΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° next
ΠΌΡ ΡΡΠΈΠ³Π³Π΅ΡΠΈΠΌ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ»Π»Π±ΡΠΊΠ°
import { Component } from '@angular/core';
import { Subscription, Subject } from 'rxjs';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent {
sub: Subscription;
stream$: Subject<number> = new Subject<number>();
counter: number = 0;
constructor() {
this.sub = this.stream$.subscribe((value) => {
console.log('Subscribe', value);
});
}
stop() {
this.sub.unsubscribe();
}
next() {
this.counter += 1;
this.stream$.next(this.counter);
}
}
ΠΡΠ·ΡΠ²Π°Π΅ΠΌ ΠΌΠ΅ΡΠΎΠ΄
<div class='container'>
<h1>RxJS</h1>
<button class='btn' (click)='stop()'>Stop Interval</button>
<button class='btn btn-danger' (click)='next()'>Next value</button>
</div>
Π ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΠΈΠ³Π³Π΅ΡΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°ΡΡΡΡ ΠΏΠΎ ΡΠ°Π±ΡΠΊΡΠ°ΠΉΠ±Ρ