Reference · Frontend · Angular 16 + RxJS

RxJS untuk interview Angular 16

Ringkasan satu halaman. Dari Lesson 0015.

Observable vs Promise

PromiseObservable
Mulailangsung saat dibuat (eager)saat subscribe() (lazy)
Nilaisatunol sampai banyak (next / error / complete)
Bataltidak bisaunsubscribe()
Rangkai.then / .catch.pipe(op, op) lalu .subscribe

HttpClient: cold. Tanpa subscribe tidak ada request; dua kali subscribe = dua request.

Subject

JenisSubscriber baru menerimaPakai untukReact
Subjecthanya nilai setelah subscribeeventevent emitter
BehaviorSubject(awal)nilai terakhir, langsungstate bersama di servicestate di Context / store
ReplaySubject(n)n nilai terakhircache beberapa nilai–
private readonly items = new BehaviorSubject<Product[]>([]);
readonly items$ = this.items.asObservable();
add(p: Product) { this.items.next([...this.items.value, p]); }

Pilih operator

SkenarioOperatorKenapa
Search box / route paramdebounceTime → distinctUntilChanged → switchMaprequest lama dibatalkan, hasil lama tidak menimpa
Beberapa request paralel, tunggu semuaforkJoinseperti Promise.all; satu error = semua error
Hapus/upload massal, semua harus jalanmergeMap (opsi concurrent)paralel, tidak ada yang dibatalkan
Simpan berurutanconcatMapantre; = mergeMap dengan concurrency 1
Tombol Simpan/Login diklik berkali-kaliexhaustMapklik baru diabaikan selama request jalan
Ubah bentuk datamapseperti Array.map per nilai
Request gagal → nilai cadangancatchError(() => of([]))seperti .catch; taruh di dalam switchMap

Mencegah memory leak

  1. async pipe (utama): *ngFor="let p of products$ | async". Subscribe dan unsubscribe otomatis.
  2. takeUntil(this.destroy$) di akhir pipe; ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); }
  3. takeUntilDestroyed() (@angular/core/rxjs-interop): ada di v16 tapi masih developer preview.

Berbahaya: subscribe manual ke stream yang tidak pernah complete (interval, valueChanges, Subject di service) tanpa cleanup. React: useEffect tanpa cleanup.

Jebakan interview

  1. Lupa subscribe pada http.get → tidak ada request.
  2. mergeMap di search box → race condition, hasil lama menimpa.
  3. catchError di stream luar → search box mati setelah error pertama.
  4. switchMap untuk DELETE massal → sebagian request dibatalkan.

Sumber: RxJS Observable · RxJS Subject · switchMap · mergeMap · exhaustMap · forkJoin · Angular v16: Observables compared · HttpClient · AsyncPipe