0Pricing
React Academy · Pelajaran

Kondisi Balapan & Pembersihan Effect

Gunakan AbortController dalam useEffect untuk membatalkan permintaan fetch yang sudah usang saat render ulang.

Kondisi Balapan & Pembersihan Effect adalah pelajaran React Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar React Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus React Academy mencakup 4 pelajaran total.

Selamat Datang

Dalam pelajaran ini Anda akan mempelajari bagaimana kondisi balapan terjadi dalam efek React yang mengambil data, serta cara menghilangkannya menggunakan AbortController untuk pembersihan.

Apa Itu Kondisi Balapan?

Kondisi balapan terjadi ketika dua operasi asinkron selesai dalam urutan yang tidak dapat diprediksi. Dalam React, jika pengguna berpindah antaritem dengan cepat, pengambilan data yang lambat untuk item A mungkin selesai setelah pengambilan data untuk item B, sehingga menampilkan data usang.

Kesalahan: Respons Pengambilan Data Usang

Tanpa pembersihan, jika komponen dirender ulang dengan ID baru sebelum pengambilan data lama selesai, kedua pengambilan akan berjalan. Pengambilan yang lebih lama dan lebih lambat dapat menimpa data yang lebih baru dalam status.
useEffect(() => {
  fetch('/api/item/' + id)
    .then(r => r.json())
    .then(data => setData(data)); // may run AFTER a newer fetch!
}, [id]);

Perbaikan 1: Penanda ignore

Perbaikan sederhana: tetapkan bendera boolean `ignore` dalam efek. Fungsi pembersihan menetapkannya ke true. Panggilan balik pengambilan data memeriksa bendera tersebut sebelum memanggil setState.
useEffect(() => {
  let ignore = false;
  fetch('/api/item/' + id)
    .then(r => r.json())
    .then(data => { if (!ignore) setData(data); });
  return () => { ignore = true; };
}, [id]);

Perbaikan 2: AbortController

AbortController adalah standar modern. Buat controller dalam efek, teruskan sinyalnya ke pengambilan data, lalu batalkan dalam fungsi pembersihan. Pengambilan data akan memunculkan AbortError yang dapat Anda abaikan.
useEffect(() => {
  const controller = new AbortController();
  fetch('/api/item/' + id, { signal: controller.signal })
    .then(r => r.json())
    .then(data => setData(data))
    .catch(err => {
      if (err.name === 'AbortError') return; // expected
      setError(err.message);
    });
  return () => controller.abort();
}, [id]);

AbortController dengan async/await

Gunakan try/catch dengan fungsi asinkron di dalam useEffect. Abaikan AbortError di blok catch.
useEffect(() => {
  const ctrl = new AbortController();
  async function load() {
    try {
      const res = await fetch('/api/' + id, { signal: ctrl.signal });
      const json = await res.json();
      setData(json);
    } catch (e) {
      if (e.name !== 'AbortError') setError(e.message);
    }
  }
  load();
  return () => ctrl.abort();
}, [id]);

Pembersihan Selalu Diperlukan

Meskipun kondisi balapan tampaknya tidak mungkin terjadi, misalnya pada pengambilan data satu kali saat pemasangan, selalu tambahkan pembersihan. Dalam React 18 StrictMode, efek dijalankan dua kali — tanpa pembersihan, permintaan pertama yang ditinggalkan akan mengotori status.

Jebakan Asinkron useEffect

Panggilan balik useEffect tidak dapat berupa `async`. Definisikan fungsi asinkron di dalam efek dan panggil segera — atau gunakan fungsi biasa dengan .then()/.catch().
useEffect(() => {
  // useEffect callback is NOT async
  async function fetchData() { /* ... */ }
  fetchData(); // call it
  return () => ctrl.abort();
}, [id]);

Pustaka Menangani Ini untuk Anda

React Query, SWR, dan RTK Query semuanya menangani kondisi balapan, abort, dan pembersihan secara otomatis. Saat menggunakan pustaka ini, Anda tidak perlu menulis kode AbortController secara manual.

Menguji Kondisi Balapan

Untuk menguji kondisi balapan secara manual: buka DevTools jaringan, batasi kecepatan ke '3G Lambat', lalu klik antaritem dengan cepat. Tanpa pembersihan, Anda akan melihat data usang muncul sekilas. Dengan AbortController, hanya item terakhir yang dipilih yang ditampilkan.

Pemeriksaan Singkat

Apa yang dilakukan pemanggilan controller.abort() dalam fungsi pembersihan useEffect?

Rangkuman

Kondisi balapan terjadi ketika respons pengambilan data usang memperbarui status setelah pengambilan data yang lebih baru. Perbaiki dengan bendera ignore atau AbortController. Selalu lakukan abort atau abaikan dalam pembersihan useEffect. Pustaka seperti React Query menanganinya secara otomatis.

Berikutnya

Pelajaran berikutnya: **useTransition untuk Pembaruan Antarmuka yang Tidak Memblokir** — Anda akan membungkus pembaruan status yang mahal dalam startTransition agar antarmuka tetap responsif.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Kondisi Balapan & Pembersihan Effect” gratis?

Ya — teks lengkap “Kondisi Balapan & Pembersihan Effect” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus React Academy, upgrade ke CoddyKit PRO. Kursus React Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Kondisi Balapan & Pembersihan Effect”?

Gunakan AbortController dalam useEffect untuk membatalkan permintaan fetch yang sudah usang saat render ulang. Kamu berlatih React Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai React Academy?

Tidak diperlukan pengalaman sebelumnya. React Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Kondisi Balapan & Pembersihan Effect” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran React Academy ini?

Ya. Setiap pelajaran React Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Kondisi Balapan & Pembersihan Effect
  2. useTransition untuk Pembaruan UI Non-Pemblokiran
  3. useDeferredValue untuk Penundaan Input
  4. Suspense untuk Batas Data & Kode
← Kembali ke React Academy