JavaScript terkenal dengan sifatnya yang single-threaded, sehingga pemahaman tentang asynchronous programming sangat penting untuk membuat aplikasi responsif dan scalable.
Setelah memahami callback, promise, dan async/await, langkah berikutnya adalah advanced asynchronous patterns yang sering dipakai dalam proyek profesional.
Bab ini membahas generator function, async iterator, observable, throttling/debouncing, dan cancellation token.
Contents
1. Generator Function & yield
Generator function adalah fungsi yang dapat dihentikan sementara dan dilanjutkan di titik tertentu menggunakan yield.
function* simpleGenerator() {
yield 1;
yield 2;
yield 3;
}
const gen = simpleGenerator();
console.log(gen.next()); // { value: 1, done: false }
console.log(gen.next()); // { value: 2, done: false }
console.log(gen.next()); // { value: 3, done: false }
console.log(gen.next()); // { value: undefined, done: true }
Manfaat generator:
- Membuat data stream secara lazy
- Mengontrol flow asynchronous secara manual
- Digunakan untuk iterasi besar tanpa menghabiskan memori
2. Async Iterator / for await…of
Async iterator adalah cara untuk mengiterasi data asynchronous, seperti stream atau API yang mengembalikan promise.
async function* asyncNumbers() {
for (let i = 1; i <= 3; i++) {
await new Promise(res => setTimeout(res, 1000)); // simulasi async
yield i;
}
}
(async () => {
for await (const num of asyncNumbers()) {
console.log(num); // 1, 2, 3 (dengan delay 1 detik tiap angka)
}
})();
Manfaat:
- Iterasi data asynchronous dengan sintaks mirip loop biasa
- Mengurangi callback hell
- Ideal untuk streaming API atau data incremental
3. Observable / RxJS Dasar
Observable adalah pola programming reaktif, memungkinkan mengamati perubahan data atau event.
import { Observable } from 'rxjs';
const obs = new Observable(subscriber => {
subscriber.next(1);
subscriber.next(2);
setTimeout(() => subscriber.next(3), 1000);
setTimeout(() => subscriber.complete(), 1500);
});
obs.subscribe({
next: val => console.log(val),
complete: () => console.log('Done')
});
Manfaat:
- Mempermudah event-driven programming
- Digunakan di framework modern seperti Angular
- Bisa digabung dengan operator map, filter, reduce
4. Throttling & Debouncing Async Tasks
Throttling dan debouncing adalah teknik untuk mengontrol frekuensi eksekusi fungsi, sangat berguna di UI atau event-heavy apps.
a. Debouncing
Menunda eksekusi hingga aktivitas berhenti.
function debounce(fn, delay) {
let timeout;
return function(...args) {
clearTimeout(timeout);
timeout = setTimeout(() => fn.apply(this, args), delay);
};
}
window.addEventListener('resize', debounce(() => {
console.log('Resize event fired!');
}, 500));
b. Throttling
Membatasi fungsi hanya dijalankan sekali setiap interval tertentu.
function throttle(fn, limit) {
let inThrottle;
return function(...args) {
if (!inThrottle) {
fn.apply(this, args);
inThrottle = true;
setTimeout(() => inThrottle = false, limit);
}
};
}
window.addEventListener('scroll', throttle(() => {
console.log('Scroll event fired!');
}, 1000));
Manfaat:
- Mengurangi beban CPU & memory
- Mengoptimalkan performa aplikasi dengan event berat
5. Cancellation Token / Abort Controller
Kadang kita ingin membatalkan operasi async, misalnya fetch API yang sudah tidak dibutuhkan. Gunakan AbortController.
const controller = new AbortController();
const signal = controller.signal;
fetch('https://jsonplaceholder.typicode.com/todos/1', { signal })
.then(response => response.json())
.then(data => console.log(data))
.catch(err => {
if (err.name === 'AbortError') {
console.log('Fetch aborted');
}
});
// Batalkan request setelah 500ms
setTimeout(() => controller.abort(), 500);
Manfaat:
- Menghindari request tak perlu
- Meningkatkan performa dan UX
- Berguna untuk cancellation token patterns di async libraries
Kesimpulan
Bab ini membekali kamu dengan advanced asynchronous patterns yang sering digunakan dalam aplikasi real-world:
- Generator function & yield → kontrol flow & lazy evaluation
- Async iterator / for await…of → iterasi data async dengan loop sederhana
- Observable / RxJS → reactive programming
- Throttling & debouncing → optimasi event-heavy UI
- Cancellation token / AbortController → batalkan task async yang tidak perlu
Menguasai pola ini memungkinkan developer membuat aplikasi responsif, efisien, dan scalable, terutama pada proyek real-time, streaming, dan UI interaktif.