Kwinten Pisman
Freelance frontend architect. Occasional blogger. Reactive fan.
@KwintenP
@KwintenP
@KwintenP
🇧🇪 Kwinten Pisman
Freelance frontend architect
Meetup organiser
Co-founder Strongbrew
GDE for Angular
@KwintenP
@KwintenP
strongbrew.io
@KwintenP
blog.strongbrew.io
angular-checklist.io
Angular Profiler Devtools
@KwintenP
boolean
number
strings
objects
@KwintenP
@KwintenP
@KwintenP
@KwintenP
Reachability
@KwintenP
Shallow size
Retained size
@KwintenP
@KwintenP
Memory which is no longer needed that is not released.
@KwintenP
@KwintenP
@KwintenP
@KwintenP
DOM Nodes
@KwintenP
@KwintenP
@KwintenP
RxJS is programming with asynchronous data streams
- André Staltz
@KwintenP
[
]
@KwintenP
@KwintenP
Observable.create(
(observer) => {
observer.next('a');
}
);
@KwintenP
👷🏻
Fn
😴
.subscribe( 🤓 )
💩
🏋🏾♂️
⌛️
😴
@KwintenP
askMrMeeseeksForHelp() {
timer(0, 1000)
.pipe(map(this.createMrMeeseeks))
.subscribe(newMrMeeseeks => this.mrMeeseeks.push(newMrMeeseeks));
}component.ts
<mr-meeseeks *ngFor="let item of mrMeeseeks" [mrMeeseeks]="item"></mr-meeseeks>component.html
1s
1s
1s
1s
1s
Heap situation
@KwintenP
HelpMeMrMeeseeksComponent
timer$
MrMeeseeks
Component
import { timer } from 'rxjs';
timer(0, 1000)
.pipe(...)
.subscribe(...);
@KwintenP
👷🏻
Fn
😴
const 🛎 = interval.subscribe( 🤓 )
⏱
🛎 .unsubscribe()
⚰️
const 🛎 = interval.subscribe( 🤓 )
👷🏻
👷🏻
😵
👷🏻
⏱
⏱
⏱
@KwintenP
Quiz time!
@KwintenP
@Component({
...
})
export class SomeComponent {
constructor(private http: HttpClient,
private router: Router,) {
}
someAction(val) {
this.http.post('some-api', {val}).subscribe();
this.router.navigate(...);
}
}@KwintenP
askMrMeeseeksForHelp() {
this.subscription = interval(1000)
.pipe(map(this.createMrMeeseeks))
.subscribe(newMrMeeseeks => this.mrMeeseeks.push(newMrMeeseeks));
}
askMrMeeseeksForHelpAgain() {
this.mrMeeseeks = [];
this.subscription = interval(1000)
.pipe(map(this.createMrMeeseeks))
.subscribe(newMrMeeseeks => this.mrMeeseeks.push(newMrMeeseeks));
}
ngOnDestroy(): void {
this.subscription.unsubscribe();
}component.ts
askMrMeeseeksForHelp() {
this.subscription = interval(1000)
.pipe(map(this.createMrMeeseeks))
.subscribe(newMrMeeseeks => this.mrMeeseeks.push(newMrMeeseeks));
}
ngOnDestroy(): void {
this.subscription.unsubscribe();
}import { timer } from 'rxjs';
timer(0, 1000)
.pipe(...)
.subscribe(...);
@KwintenP
Fn
😴
🛎 .unsubscribe()
🛎= interval$.subscribe( 🤓 )
😵
👷🏻
⏱
let 🛎= interval$.subscribe( 🤓 )
Fn
⚰️
👷🏻
⏱
⚰️
👷🏻
@KwintenP
@KwintenP
@Component({
template: `<mr-meeseeks *ngFor="let item of mrMeeseeks" [mrMeeseeks]="item">
</mr-meeseeks>`
})
export class HelpMeMultipleTimesMrMeeseeksComponent implements OnDestroy {
mrMeeseeks: Array<MrMeeseeks> = [];
stop$ = new Subject<void>();
// ...
ngOnInit() {
timer(0, 1000)
.pipe(
map(this.createMrMeeseeks),
takeUntil(this.stop$),
)
.subscribe(newMrMeeseeks => this.mrMeeseeks.push(newMrMeeseeks));
}
ngOnDestroy() {
this.stop$.next();
}
}@KwintenP
@Component({
template: `<mr-meeseeks *ngFor="let item of mrMeeseeks" [mrMeeseeks]="item">
</mr-meeseeks>`
})
export class HelpMeMultipleTimesMrMeeseeksComponent implements OnDestroy {
mrMeeseeks: Array<MrMeeseeks> = [];
stop$ = new Subject<void>();
// ...
ngOnInit() {
timer(0, 1000)
.pipe(
map(this.createMrMeeseeks),
)
.subscribe(newMrMeeseeks => this.mrMeeseeks.push(newMrMeeseeks));
}
ngOnDestroy() {
this.stop$.next();
}
}@Component({
template: `<mr-meeseeks *ngFor="let item of mrMeeseeks" [mrMeeseeks]="item">
</mr-meeseeks>`
})
export class HelpMeMultipleTimesMrMeeseeksComponent implements OnDestroy {
mrMeeseeks: Array<MrMeeseeks> = [];
stop$ = new Subject<void>();
// ...
ngOnInit() {
timer(0, 1000)
.pipe(
map(this.createMrMeeseeks),
)
.subscribe(newMrMeeseeks => this.mrMeeseeks.push(newMrMeeseeks));
}
}@Component({
template: `<mr-meeseeks *ngFor="let item of mrMeeseeks" [mrMeeseeks]="item">
</mr-meeseeks>`
})
export class HelpMeMultipleTimesMrMeeseeksComponent implements OnDestroy {
mrMeeseeks: Array<MrMeeseeks> = [];
// ...
ngOnInit() {
timer(0, 1000)
.pipe(
map(this.createMrMeeseeks),
)
.subscribe(newMrMeeseeks => this.mrMeeseeks.push(newMrMeeseeks));
}
}Quiz time!
@KwintenP
@Component({
...
})
export class HelpMeMultipleTimesMrMeeseeksComponent implements OnDestroy {
mrMeeseeks: Array<MrMeeseeks> = [];
stop$ = new Subject<void>();
// ...
ngOnInit() {
combineLatest(
timer(0, 1000).pipe(
map(this.createMrMeeseeks),
takeUntil(this.stop$),
),
doesNotComplete$
).subscribe(newMrMeeseeks => this.mrMeeseeks.push(newMrMeeseeks));
}
ngOnDestroy() {
this.stop$.next();
}
}takeUntil( )
!
combineLatest
Nicholas Jamieson: https://blog.angularindepth.com/rxjs-avoiding-takeuntil-leaks-fb5182d047ef
@Component({
template: `<mr-meeseeks *ngFor="let item of mrMeeseeks$ | async"
[mrMeeseeks]="item"></mr-meeseeks>`
})
export class HelpMeMultipleTimesMrMeeseeksComponent {
mrMeeseeks$: Observable<Array<MrMeeseeks>> = [];
// ...
ngOnInit() {
this.mrMeeseeks$ = timer(0, 1000)
.pipe(
map(this.createMrMeeseeks)
);
}
}@KwintenP
@Component({
template: `<mr-meeseeks *ngFor="let item of "
[mrMeeseeks]="item"></mr-meeseeks>`
})
export class HelpMeMultipleTimesMrMeeseeksComponent {
// ...
ngOnInit() {
timer(0, 1000)
.pipe(
map(this.createMrMeeseeks)
);
}
}@Component({
template: `<mr-meeseeks *ngFor="let item of "
[mrMeeseeks]="item"></mr-meeseeks>`
})
export class HelpMeMultipleTimesMrMeeseeksComponent {
// ...
ngOnInit() {
this.mrMeeseeks$ = timer(0, 1000)
.pipe(
map(this.createMrMeeseeks)
);
}
}@Component({
template: `<mr-meeseeks *ngFor="let item of "
[mrMeeseeks]="item"></mr-meeseeks>`
})
export class HelpMeMultipleTimesMrMeeseeksComponent {
mrMeeseeks$: Observable<Array<MrMeeseeks>> = [];
// ...
ngOnInit() {
this.mrMeeseeks$ = timer(0, 1000)
.pipe(
map(this.createMrMeeseeks)
);
}
}@KwintenP
lift<R>(operator: Operator<T, R>): Observable<R> {
const observable = new Observable<R>();
observable.source = this;
observable.operator = operator;
return observable;
}@KwintenP
interval$
.map()
mapInterval$
- operator: map
- source: interval$
@KwintenP
interval$
mapInterval$
- operator: map
- source: interval$
.subscribe(🤓)
.subscribe(🤓)
MapSubscriber
Quiz time!
@Component({
...
})
export class SomeComponent {
local$ = new Subject();
constructor(private http: HttpClient,
private router: Router,) {
}
ngOnInit() {
local$.subscribe(
// do something here
)
}
someAction(val) {
local$.next(val);
}
}Quiz time!
@Component({
...
})
export class SomeComponent {
constructor(private route: Activatedrout) {
}
ngOnInit() {
route.subscribe(
// do something here
);
}
}@KwintenP
@KwintenP
@KwintenP
@KwintenP
By Kwinten Pisman
Freelance frontend architect. Occasional blogger. Reactive fan.