
рдПрдХ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рд╕рджрд╕реНрдпрддрд╛ рдХрд╛ рд░рд┐рд╡рд░реНрд╕ рд╕рд╛рдЗрдб
рдСрдмреНрдЬрд░реНрд╡рдмрд▓реНрд╕ рдореЗрдВ рдПрдХ рд╕рджрд╕реНрдпрддрд╛ рд╡рд┐рдзрд┐ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕реЗ рдСрдмреНрдЬрд╝рд░реНрд╡реЗрдмрд▓ рдХреЛ рднреЗрдЬреЗ рдЧрдП ( рдПрдорд┐рдЯ ) рднреЗрдЬреЗ рдЧрдП рдорд╛рдиреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЛрдгреАрдп рдореЗрдВ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдШрдЯрдХреЛрдВ / рдирд┐рд░реНрджреЗрд╢реЛрдВ рдореЗрдВ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд░рд╛рдЙрдЯрд░ рдореЙрдбреНрдпреВрд▓, NgRx рдФрд░ HTTP рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрджрд┐ рд╣рдо рдПрдХ рд╕реНрдЯреНрд░реАрдо рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЦреБрд▓реА рд░рд╣реЗрдЧреА рдФрд░ рдЗрд╕реЗ рддрдм рднреА рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдХрд┐рд╕реА рднреА рд╣рд┐рд╕реНрд╕реЗ рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЗрд╕рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдЕрдирд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд░рдХреЗ рдХреЙрд▓ рдмрдВрдж рди рд╣реЛ рдЬрд╛рдПред
@Component({...}) export class AppComponent implements OnInit { subscription: Subscription ngOnInit () { const observable = Rx.Observable.interval(1000); this.subscription = observable.subscribe(x => console.log(x)); } }
рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрдХрдВрдб рдореЗрдВ рдорд╛рди рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдВрддрд░рд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рднреЗрдЬреЗ рдЧрдП рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВ, рдФрд░ рд╣рдорд╛рд░реЗ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВред
рдЕрдм, рдпрджрд┐ AppComponent рдирд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдШрдЯрдХ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдпрд╛ рдирд╖реНрдЯ () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрднреА рднреА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдХрдВрд╕реЛрд▓ рд▓реЙрдЧ рджреЗрдЦреЗрдВрдЧреЗред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрджреНрдпрдкрд┐ AppComponent рдирд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдерд╛, рд╕рджрд╕реНрдпрддрд╛ рд░рджреНрдж рдирд╣реАрдВ рдХреА рдЧрдИ рдереАред
рдпрджрд┐ рд╕рджрд╕реНрдпрддрд╛ рдмрдВрдж рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рддреЛ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рдореЗрдореЛрд░реА рдореЗрдореЛрд░реА рдФрд░ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛рдПрдВ рдЧрдВрднреАрд░ рд╣реЛ рдЬрд╛рдПрдВрдЧреАред рд▓реАрдХ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рд░ рдмрд╛рд░ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рд╕реЗ "рдЕрдирд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм" рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
1. рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рдХрд┐рд╕реА рднреА рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рдкрд╛рд╕ рдореБрдлреНрдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рд╣реИред рдореЗрдореЛрд░реА рд░рд┐рд╕рд╛рд╡ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдореЗрдВ рдЕрдирд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдирд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдХреЛрдгреАрдп рдореЗрдВ, рдЖрдкрдХреЛ рдПрдХ рдШрдЯрдХ рдХреЗ рдирд╖реНрдЯ рд╣реЛрдиреЗ рдкрд░ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рд╕реЗ рдЕрдирд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдХреЛрдгреАрдп рдореЗрдВ рдПрдХ рдПрдирдЧреЙрдиреНрдбреЗрд╕реНрдЯреНрд░реЛ рд╣реБрдХ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдШрдЯрдХ рдХреЛ рдирд╖реНрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдореЗрдореЛрд░реА рдХреЛ рд╕рд╛рдл рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдардВрдб рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди, рдЦреБрд▓реЗ рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рдФрд░ рдкреИрд░ рдореЗрдВ рдЕрдиреНрдп рд╢реЙрдЯреНрд╕ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдПред
@Component({тАж}) export class AppComponent implements OnInit, OnDestroy { subscription: Subscription ngOnInit () { const observable = Rx.Observable.interval(1000); this.subscription = observable.subscribe(x => console.log(x)); } ngOnDestroy() { this.subscription.unsubscribe() } }
рд╣рдордиреЗ рдЕрдкрдиреЗ AppComponent рдореЗрдВ ngOnDestroy рдХреЛ рдЬреЛрдбрд╝рд╛ рдФрд░ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ this.subscription рдкрд░ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ ред рдЬрдм AppComponent рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ, рдирд╖реНрдЯ () рд╡рд┐рдзрд┐, рдЖрджрд┐), рд╕рджрд╕реНрдпрддрд╛ рдлреНрд░реАрдЬ рдирд╣реАрдВ рд╣реЛрдЧреА, рдЕрдВрддрд░рд╛рд▓ рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЕрдзрд┐рдХ рдХрдВрд╕реЛрд▓ рд▓реЙрдЧ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рд╕рджрд╕реНрдпрддрд╛рдПрдВ рд╣реИрдВ?
@Component({тАж}) export class AppComponent implements OnInit, OnDestroy { subscription1$: Subscription; subscription2$: Subscription; ngOnInit () { const observable1$ = Rx.Observable.interval(1000); const observable2$ = Rx.Observable.interval(400); this.subscription1$ = observable.subscribe(x => console.log("From interval 1000" x)); this.subscription2$ = observable.subscribe(x => console.log("From interval 400" x)); } ngOnDestroy() { this.subscription1$.unsubscribe(); this.subscription2$.unsubscribe(); } }
AppComponent рдореЗрдВ рджреЛ рд╕рджрд╕реНрдпрддрд╛рдПрдБ рд╣реИрдВ рдФрд░ рджреЛрдиреЛрдВ ngOnDestroy рд╣реБрдХ рдореЗрдВ рдЕрдирд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХреА рдЧрдИ рд╣реИрдВ, рдЬреЛ рдореЗрдореЛрд░реА рд░рд┐рд╕рд╛рд╡ рдХреЛ рд░реЛрдХрддреА рд╣реИрдВред
рдЖрдк рдПрдХ рд╕рд░рдгреА рдореЗрдВ рд╕рднреА рд╕рджрд╕реНрдпрддрд╛рдПрдБ рднреА рдПрдХрддреНрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд▓реВрдк рдореЗрдВ рдЕрдирд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
@Component({тАж}) export class AppComponent implements OnInit, OnDestroy { subscription1$: Subscription; subscription2$: Subscription; subscriptions: Subscription[] = []; ngOnInit () { const observable1$ = Rx.Observable.interval(1000); const observable2$ = Rx.Observable.interval(400); this.subscription1$ = observable.subscribe(x => console.log("From interval 1000" x)); this.subscription2$ = observable.subscribe(x => console.log("From interval 400" x)); this.subscriptions.push(this.subscription1$); this.subscriptions.push(this.subscription2$); } ngOnDestroy() { this.subscriptions.forEach((subscription) => subscription.unsubscribe()); } }
рд╕рджрд╕реНрдпрддрд╛ рд╡рд┐рдзрд┐ рдкреНрд░рдХрд╛рд░ рд╕рджрд╕реНрдпрддрд╛ рдХреА рдПрдХ RxJS рд╡рд╕реНрддреБ рд▓реМрдЯрд╛рддреА рд╣реИред рдпрд╣ рдПрдХ рдмрд╛рд░ рдХрд╛ рд╕рдВрд╕рд╛рдзрди рд╣реИред рдРрдб рдореЗрдердб рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рдХреЛ рдЧреНрд░реБрдк рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЪрд╛рдЗрд▓реНрдб рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рдХреЛ рдХрд░рдВрдЯ рд╕реЗ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред рдЬрдм рдХреЛрдИ рд╕рджрд╕реНрдпрддрд╛ рд░рджреНрдж рд╣реЛрддреА рд╣реИ, рддреЛ рдЙрд╕рдХреЗ рд╕рднреА рдмрдЪреНрдЪреЗ рднреА рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЖрдЗрдП рд╣рдорд╛рд░реЗ AppComponent рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
@Component({тАж}) export class AppComponent implements OnInit, OnDestroy { subscription: Subscription; ngOnInit () { const observable1$ = Rx.Observable.interval(1000); const observable2$ = Rx.Observable.interval(400); const subscription1$ = observable.subscribe(x => console.log("From interval 1000" x)); const subscription2$ = observable.subscribe(x => console.log("From interval 400" x)); this.subscription.add(subscription1$); this.subscription.add(subscription2$); } ngOnDestroy() { this.subscription.unsubscribe() } }
рдЗрд╕рд▓рд┐рдП рд╣рдо рдШрдЯрдХ рдХреЗ рд╡рд┐рдирд╛рд╢ рдХреЗ рд╕рдордп рдЗрд╕ $ .subscripton1 $ рдФрд░ this.subscripton2 $ рд▓рд┐рдЦреЗрдВрдЧреЗ ред
2. Async рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ | рдкрд╛рдЗрдк
рдкрд╛рдЗрдк async рдЕрд╡рд▓реЛрдХрди рдпрд╛ рд╡рд╛рджрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдкрд╛рд░рд┐рдд рдЕрдВрддрд┐рдо рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЬрдм рдХреЛрдИ рдирдпрд╛ рдорд╛рди рд╕рдмрдорд┐рдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкрд╛рдЗрдк рдПрд╕рд┐рдВрдХреНрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдЯреНрд░реИрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдШрдЯрдХ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдШрдЯрдХ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкрд╛рдЗрдк рдПрд╕рд┐рдВрдХреНрд╕ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИред
@Component({ ..., template: ` <div> Interval: {{observable$ | async}} </div> ` }) export class AppComponent implements OnInit { observable$; ngOnInit () { this.observable$ = Rx.Observable.interval(1000); } }
рдкреНрд░рд╛рд░рдВрдн рд╣реЛрдиреЗ рдкрд░, AppComponent рдЕрдВрддрд░рд╛рд▓ рд╡рд┐рдзрд┐ рд╕реЗ рдПрдХ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдмрдирд╛рдПрдЧрд╛ред рдЕрд╡рд▓реЛрдХрдиреАрдп $ рдкреИрдЯрд░реНрди рдореЗрдВ, Async рдкрд╛рд╕ рд╣реИред рдпрд╣ рдЕрд╡рд▓реЛрдХрдиреАрдп $ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдбреЛрдо рдореЗрдВ рдЗрд╕рдХрд╛ рдореВрд▓реНрдп рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЬрдм AppComponent рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╡рд╣ рднреА рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдЧрд╛ред рдЗрд╕рдХреА рдХрдХреНрд╖рд╛ рдореЗрдВ рдкрд╛рдЗрдк рдПрд╕реНрд╕реЗрдВрдХ рдореЗрдВ ngOnDestroy рд╣реБрдХ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рддрдм рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рдЗрд╕рдХрд╛ рджреГрд╢реНрдп рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рдкрд╛рдЗрдк рдПрд╕рд┐рдВрдХреНрд╕ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рд╕реНрд╡рдпрдВ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдирд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдЧрд╛ред рдФрд░ рдЕрдм рд╣рдо рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдЕрдЧрд░ рд╣рдо ngOnDestroy рдореЗрдВ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВред
3. RxJS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ * рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд▓реЗрдВ
RxJS рдореЗрдВ рдРрд╕реЗ рдЙрдкрдпреЛрдЧреА рдСрдкрд░реЗрдЯрд░ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдк рд╣рдорд╛рд░реЗ рдХреЛрдгреАрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдШреЛрд╖рдгрд╛рддреНрдордХ рддрд░реАрдХреЗ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдСрдкрд░реЗрдЯрд░ рд╣реИ * рд▓реЗ ** рдкрд░рд┐рд╡рд╛рд░:
- рд▓реЗрдирд╛ (n)
- рдЯреЗрдХ рдпреВрдЯрд┐рд▓ (рдиреЛрдЯрд┐рдлрд╝рд╛рдпрд░)
- takeWile (рд╡рд┐рдзреЗрдп)
рд▓реЗрдирд╛ (n)
рдпрд╣ рдСрдкрд░реЗрдЯрд░ рдХрдИ рдмрд╛рд░ рдФрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдореВрд▓ рд╕рджрд╕реНрдпрддрд╛ рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░, рдПрдХ (1) рд╕рджрд╕реНрдпрддрд╛ рдФрд░ рдирд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣ рдСрдкрд░реЗрдЯрд░ рдЙрдкрдпреЛрдЧреА рд╣реИ рдЕрдЧрд░ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдПрдХ рдмрд╛рд░ рдПрдХ рдорд╛рди рдкрд╛рд░рд┐рдд рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ:
@Component({...}) export class AppComponent implements OnInit { subscription$; ngOnInit () { const observable$ = Rx.Observable.interval(1000); this.subscription$ = observable$.pipe(take(1)). subscribe(x => console.log(x)); } }
рдЬрдм рдЕрдВрддрд░рд╛рд▓ рдкрд╣рд▓рд╛ рдорд╛рди рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рддреЛ рд╕рджрд╕реНрдпрддрд╛ $ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧреАред
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ : рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ AppComponent рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рджрд╕реНрдпрддрд╛ $ рд╕рджрд╕реНрдпрддрд╛ рдХреЛ рд░рджреНрдж рдирд╣реАрдВ рдХрд░реЗрдЧреА рдЬрдм рддрдХ рдХрд┐ рдЕрдВрддрд░рд╛рд▓ рдореВрд▓реНрдп рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ ngOnDestroy рд╣реБрдХ рдореЗрдВ рд╕рдм рдХреБрдЫ рдЕрдирд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
@Component({тАж}) export class AppComponent implements OnInit, OnDestroy { subscription$; ngOnInit () { var observable$ = Rx.Observable.interval(1000); this.subscription$ = observable$.pipe(take(1)).subscribe(x => console.log(x)); } ngOnDestroy() { this.subscription$.unsubscribe(); } }
рдЯреЗрдХ рдпреВрдЯрд┐рд▓ (рдиреЛрдЯрд┐рдлрд╝рд╛рдпрд░)
рдпрд╣ рдХрдерди рдореВрд▓ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдиреЛрдЯрд┐рдлрд╝рд╛рдпрд░ рдПрдХ рдкреВрд░реНрдг рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИред
@Component({тАж}) export class AppComponent implements OnInit, OnDestroy { notifier = new Subject(); ngOnInit () { const observable$ = Rx.Observable.interval(1000); observable$.pipe(takeUntil(this.notifier)).subscribe(x => console.log(x)); } ngOnDestroy() { this.notifier.next(); this.notifier.complete(); } }
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╖рдп рд╣реИ, рдЬреЛ рдЗрд╕ рд╕рджрд╕реНрдпрддрд╛ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдорд╛рдВрдб рднреЗрдЬреЗрдЧрд╛ ред рдЬрдм рддрдХ рд╣рдо рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рддрдм рддрдХ рд╣рдо рдЯреЗрдХ рдпреВрдЯрд┐рд▓ рдореЗрдВ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рд╣реЛрддреЗ рд╣реИрдВред рдЯреЗрдХрдЕрдВрдЯрд┐рд▓ рдЗрдВрдЯрд░рд╡рд▓ рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░реЗрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдиреЛрдЯрд┐рдлрд╝рд╛рдпрд░ рдкрд░реНрдпрд╡реЗрдХреНрд╖рд┐рдд $ рдХреЛ рдЕрдирд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдирд╣реАрдВ рдХрд░рддрд╛ред рдпрд╣ рдиреЛрдЯрдСрдирд╕реНрдЯреНрд░реЛ рд╣реБрдХ рдореЗрдВ рдиреЛрдЯрд┐рдлрд╝рд╛рдпрд░ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред
takeWile (рд╡рд┐рдзреЗрдп)
рдЬрдм рддрдХ рд╡реЗ рд╡рд┐рдзреЗрдп рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ, рддрдм рддрдХ рдпрд╣ рдХрдерди рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░реЗрдЧрд╛ред
@Component({...}) export class AppComponent implements OnInit { ngOnInit () { const observable$ = Rx.Observable.interval(1000); observable$.pipe(takeWhile(value => value < 10)).subscribe(x => console.log(x)); } }
рд╣рдо рдЯреЗрдХрд╣рд╛рдЗрд╡ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп $ рдХреЛ рдкрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдорд╛рдиреЛрдВ рдХреЛ рддрдм рддрдХ рднреЗрдЬреЗрдВрдЧреЗ рдЬрдм рддрдХ рдХрд┐ рд╡реЗ 10. рд╕реЗ рдХрдо рди рд╣реЛрдВред рдпрджрд┐ 10 рд╕реЗ рдЕрдзрд┐рдХ рдпрд╛ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛ рдорд╛рди рдЖрддрд╛ рд╣реИ, рддреЛ рдСрдкрд░реЗрдЯрд░ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдЧрд╛ред
рдпрд╣ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп $ рд╕рджрд╕реНрдпрддрд╛ рддрдм рддрдХ рдЦреБрд▓реА рд░рд╣реЗрдЧреА рдЬрдм рддрдХ рдЕрдВрддрд░рд╛рд▓ 10. рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ ред рдЗрд╕рд▓рд┐рдП, рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдШрдЯрдХ рдХреЛ рдирд╖реНрдЯ рд╣реЛрдиреЗ рдкрд░ рдЕрд╕реНрдкрд╖реНрдЯ $ рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ngOnDestroy рд╣реБрдХ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
@Component({тАж}) export class AppComponent implements OnInit, OnDestroy { subscription$; ngOnInit () { var observable$ = Rx.Observable.interval(1000); this.subscription$ = observable$.pipe(takeWhile(value => value < 10)).subscribe(x => console.log(x)); } ngOnDestroy() { this.subscription$.unsubscribe(); } }
4. RxJS рдкрд╣рд▓реЗ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рдпрд╣ рдХрдерди рд╕рдВрдпреБрдХреНрдд рд▓реЗ (1) рдФрд░ рдЯреЗрдХрд╡рд╛рдЗрд▓ рдХреЗ рд╕рдорд╛рди рд╣реИред
рдпрджрд┐ рдЗрд╕реЗ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдмрд┐рдирд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрддреНрд╕рд░реНрдЬрди-рдпрд╣ рдкрд╣рд▓рд╛ рдорд╛рди рдЕрд╡рд▓реЛрдХрдиреАрдп рд╣реИ рдФрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдЗрд╕реЗ рдПрдХ рд╡рд┐рдзреЗрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рдореВрд▓ рдЕрд╡рд▓реЛрдХрди рдХрд╛ рдкрд╣рд▓рд╛ рдореВрд▓реНрдп рд╣реИ, рдЬреЛ рд╡рд┐рдзреЗрдп рдлрд╝рдВрдХреНрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред
@Component({...}) export class AppComponent implements OnInit { observable$; ngOnInit () { this.observable = Rx.Observable.interval(1000); this.observable$.pipe(first()).subscribe(x => console.log(x)); } }
рдпрджрд┐ рдЕрдВрддрд░рд╛рд▓ рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ рдореВрд▓реНрдп рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп $ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╣рдо рдХреЗрд╡рд▓ 1 рд▓реЙрдЧ рд╕рдВрджреЗрд╢ рджреЗрдЦреЗрдВрдЧреЗред
@Component({...}) export class AppComponent implements OnInit { observable$; ngOnInit () { this.observable$ = Rx.Observable.interval(1000); this.observable$.pipe(first(val => val === 10)).subscribe(x => console.log(x)); } }
рдпрд╣рд╛рдВ рдкрд╣рд▓реЗ рдорд╛рдиреЛрдВ рдХреЛ рддрдм рддрдХ рдирд╣реАрдВ рдЫреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдЕрдВрддрд░рд╛рд▓ 10 рд╕реЗ рдкрд╛рд░ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдкрд░реНрдпрд╡реЗрдХреНрд╖рд┐рдд $ рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ ред рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрджреЗрд╢ рджреЗрдЦреЗрдВрдЧреЗред
рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрджрд┐ AppComponent рдХреЛ рдкрд╣рд▓реЗ рдЕрд╡рд▓реЛрдХрди $ рд╕реЗ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдирд╖реНрдЯ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рджрд╕реНрдпрддрд╛ рддрдм рднреА рдЦреБрд▓реА рд░рд╣реЗрдЧреА рдЬрдм рддрдХ рдХрд┐ рдкрд╣рд▓рд╛ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рджреВрд╕рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрджрд┐ AppComponent рдХреЛ рдЕрдВрддрд░рд╛рд▓ рд╕реЗ рдкрд╣рд▓реЗ рдирд╖реНрдЯ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдСрдкрд░реЗрдЯрд░ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рднреА рд╕рджрд╕реНрдпрддрд╛ рдЕрдВрддрд░рд╛рд▓ рдХреЗ 10 рддрдХ рдЦреБрд▓реА рд░рд╣реЗрдЧреАред рдЗрд╕рд▓рд┐рдП, рд╕реБрд░рдХреНрд╖рд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд░рджреНрдж рдХрд░рдиреА рд╣реЛрдЧреАред рд╣реБрдХ ngOnDestroy ред
5. рдЕрдирд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рд╣рдо рд╕рднреА рдЗрдВрд╕рд╛рди рд╣реИрдВ, рд╣рдо рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВред рдкрд┐рдЫрд▓реЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ ngOnDestroy рд╣реБрдХ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рд╕рдХреЗ рдХрд┐ рдШрдЯрдХ рдХреЛ рдирд╖реНрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рджрд╕реНрдпрддрд╛ рдХреЛ рдордВрдЬреВрд░реА рджреЗ рджреА рдЧрдИ рд╣реИ ред рд▓реЗрдХрд┐рди рд╣рдо рдЙрдиреНрд╣реЗрдВ ngOnDestroy рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рднреВрд▓ рд╕рдХрддреЗ рд╣реИрдВ - рд╢рд╛рдпрдж рд╕рдордп рд╕реАрдорд╛ рдХреЗ рдХрд╛рд░рдг, рдпрд╛ рдирд░реНрд╡ рдХреНрд▓рд╛рдЗрдВрдЯ рдЬреЛ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХрд╣рд╛рдВ рд░рд╣рддреЗ рд╣реИрдВ ...
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдШрдЯрдХ рдореЗрдВ рд╕рднреА рд╕рджрд╕реНрдпрддрд╛ рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдХреЛрдгреАрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЙрдкрдпреЛрдЧреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
function AutoUnsub() { return function(constructor) { const orig = constructor.prototype.ngOnDestroy; constructor.prototype.ngOnDestroy = function() { for(let prop in this) { const property = this[prop]; if(typeof property.subscribe === "function") { property.unsubscribe(); } } orig.apply(); } } }
рдпрд╣ AutoUnsub рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдорд╛рд░реА рдХреЛрдгреАрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдореВрд▓ ngOnDestroy рд╣реБрдХ рдмрдЪрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдПрдХ рдирдпрд╛ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЙрд╕ рд╡рд░реНрдЧ рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣, рдЬрдм рдХрдХреНрд╖рд╛ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рдПрдХ рдирдпрд╛ рд╣реБрдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдп рд╡рд░реНрдЧ рдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджрд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдпрд╣ рдПрдХ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдкрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рд╕реЗ рдЕрдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рддрдм рдпрд╣ рдореВрд▓ ngOnDestroy рд╣реБрдХ рдХреЛ рдХрдХреНрд╖рд╛ рдореЗрдВ рдмреБрд▓рд╛рддрд╛ рд╣реИ , рдпрджрд┐ рдХреЛрдИ рд╣реЛред
@Component({...}) @AutoUnsub export class AppComponent implements OnInit { observable$; ngOnInit () { this.observable$ = Rx.Observable.interval(1000); this.observable$.subscribe(x => console.log(x)) } }
рд╣рдо рдЗрд╕реЗ рдЕрдкрдиреЗ AppComponent рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдм ngOnDestroy рдореЗрдВ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп $ рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ - рдбреЗрдХреЛрд░реЗрдЯрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣ рдХрд░реЗрдЧрд╛ред
рд▓реЗрдХрд┐рди рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрд╣рд▓реВ рдпрд╣ рднреА рд╣реИ - рдпрджрд┐ рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдореЗрдВ рдмрд┐рдирд╛ рд╕рдмрд╕реНрдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рдХреЛрдИ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рд╣реИ рддреЛ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрдВрдЧреАред
6. tslint рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рдХрднреА-рдХрднреА tslint рдХрд╛ рдПрдХ рд╕рдВрджреЗрд╢ рдХрдВрд╕реЛрд▓ рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдШрдЯрдХреЛрдВ рдпрд╛ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдиреЗ ngOnDestroy рд╡рд┐рдзрд┐ рдШреЛрд╖рд┐рдд рдирд╣реАрдВ рдХреА рд╣реИред рдЖрдк рдХрдВрд╕реЛрд▓ рдХреЛ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП tslint рдореЗрдВ рдПрдХ рдХрд╕реНрдЯрдо рдирд┐рдпрдо рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡реГрдХреНрд╖ рдпрд╛ рдирд┐рд░реНрдорд╛рдг рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдШрдЯрдХреЛрдВ рдореЗрдВ ngOnDestroy рд╣реБрдХ рдирд╣реАрдВ рд╣реИ:
рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ ngOnDestroy рдмрд┐рдирд╛ рдРрд╕рд╛ рдХреЛрдИ рдШрдЯрдХ рд╣реИ:
@Component({...}) export class AppComponent implements OnInit { observable$; ngOnInit () { this.observable$ = Rx.Observable.interval(1000); this.observable$.subscribe(x => console.log(x)); } }
рд▓рд┐рдВрдЯ-рдЖрдИрдПрдирдЬреА AppComponent рд╣рдореЗрдВ рд▓рд╛рдкрддрд╛ ngOnDestroy рд╣реБрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдЧрд╛:
$ ng lint Error at app.component.ts 12: Class name must have the ngOnDestroy hook
рдирд┐рд╖реНрдХрд░реНрд╖
рдЭреВрд▓рдиреЗ рдпрд╛ рдЦреБрд▓реА рд╕рджрд╕реНрдпрддрд╛ рд╕реЗ рдореЗрдореЛрд░реА рд▓реАрдХ, рддреНрд░реБрдЯрд┐рдпрд╛рдВ, рдЕрд╡рд╛рдВрдЫрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдпрд╛ рдЦрд░рд╛рдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░рджрд░реНрд╢рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдХреЛрдгреАрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╡реЗрдзрд╢рд╛рд▓рд╛ рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЛ рджреЗрдЦрд╛ред рдФрд░ рдЬреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИред