Penjelasan Loop Peristiwa JavaScript: Tumpukan Panggilan, Tugas Mikro, dan Pengatur Waktu Dengan Contoh
Mengapa setTimeout nol masih berjalan bertahan? Bagaimana satu thread bisa menangani begitu banyak hal sekaligus? Pelajari cara kerja loop peristiwa, uji dengan kode yang kami jalankan, dan selesaikan pertanyaan wawancara klasik.
- JavaScript menjalankan kode Anda pada utas tunggal, satu demi satu.
- Saat tumpukan panggilan kosong, semua tugas mikro dijalankan terlebih dahulu, lalu satu tugas.
setTimeout(fn, 0)berarti “sesegera mungkin setelah penundaan minimum”, bukan “sekarang”.- Pekerjaan sinkron yang lama memblokir semuanya, jadi pisahkan atau pindahkan ke pekerja.
Jalankan beberapa baris dengan setTimeout dan sebuah janji, dan urutan keluarannya mungkin akan mengejutkan Anda. Perulangan peristiwa JavaScript menjelaskan alasannya. Ini adalah mekanisme yang memungkinkan bahasa thread tunggal menangani pengatur waktu, panggilan jaringan, dan klik tanpa terhenti.
Setelah Anda memahaminya, seluruh kumpulan bug yang membingungkan mulai masuk akal. Kami menjalankan setiap contoh di Node.js 24, dan output berasal dari proses tersebut. Aturan pengurutan inti juga berlaku di browser, dan kami menunjukkan perbedaan Node.js. Anda akan mendapatkan lebih banyak manfaat dari ini jika Anda sudah mengetahui dasar-dasar janji JavaScript.
Mengapa event loop ada
JavaScript mengeksekusi kode Anda pada satu thread utama, jadi hanya satu bagian saja yang berjalan dalam satu waktu. Jika hanya menunggu permintaan jaringan, halaman akan terhenti hingga respons muncul kembali.
Jadi JavaScript tidak menunggu. Pekerjaan yang lambat diserahkan ke lingkungan host, artinya browser atau Node.js, yang dapat menanganinya di latar belakang. Ketika pekerjaan itu selesai, panggilan balik ditempatkan dalam antrian. Tugas perulangan peristiwa adalah memindahkan panggilan balik yang antri ke tumpukan saat bebas.
Bayangkan seorang koki yang bekerja sendirian. Koki memasukkan hidangan ke dalam oven dan menyetel pengatur waktu, alih-alih menatapnya. Saat penghitung waktu berbunyi, tugas masuk ke dalam daftar, dan koki mengambilnya setelah menyelesaikan apa yang ada di tangannya.
Bagian yang bergerak
| Bagian | Apa fungsinya | Contoh |
|---|---|---|
| Tumpukan panggilan | Melacak fungsi yang sedang berjalan | Kode sinkron Anda |
| Host API | Lakukan pekerjaan di luar kode Anda | Timer, fetch, file dibaca |
| Antrian tugas | Menahan panggilan balik yang siap dijalankan | setTimeout, klik, I/O |
| Antrean tugas mikro | Menyimpan panggilan balik dengan prioritas lebih tinggi | .then, await, queueMicrotask |
| Lingkaran peristiwa | Memutuskan apa yang berjalan selanjutnya | Berjalan terus menerus |
Tugas terkadang disebut tugas makro. Sebenarnya, mungkin ada beberapa sumber tugas, dan detail pastinya berbeda antar lingkungan.
Aturannya
- Jalankan semua kode sinkron hingga tumpukan panggilan kosong.
- Jalankan semua tugas mikro, termasuk tugas mikro baru yang ditambahkan selama proses.
- Di browser, render pembaruan jika sudah waktunya.
- Ambil satu tugas dari antrian dan jalankan.
- Kembali ke langkah 2.
Detail terpenting: semua tugas mikro, lalu satu tugas. Sebagian besar teka-teki perulangan peristiwa diselesaikan dengan menerapkan aturan tunggal tersebut.
Lihat pesanannya
console.log("1 sync");
setTimeout(() => console.log("5 timeout"), 0);
Promise.resolve().then(() => console.log("3 promise"));
queueMicrotask(() => console.log("4 microtask"));
console.log("2 sync");
// 1 sync
// 2 sync
// 3 promise
// 4 microtask
// 5 timeout
Inilah yang terjadi. Kedua jalur console.log bersifat sinkron, sehingga dijalankan terlebih dahulu. Panggilan balik janji dan queueMicrotask masuk ke antrian tugas mikro, dan dijalankan segera setelah tumpukan kosong, sesuai urutan penambahannya. Callback pengatur waktu harus menunggu giliran tugas, meskipun penundaannya nol.
Tugas mikro dijalankan di antara pengatur waktu
Setelah setiap tugas, antrean tugas mikro dikosongkan lagi. Contoh ini membuktikannya:
setTimeout(() => {
console.log("timer 1");
Promise.resolve().then(() => console.log("promise inside timer 1"));
}, 0);
setTimeout(() => console.log("timer 2"), 0);
// timer 1
// promise inside timer 1
// timer 2
Janji, yang dibuat pada pengatur waktu pertama, berjalan sebelum pengatur waktu kedua. Browser modern dan Node.js 11 dan yang lebih baru berperilaku seperti ini.
Dimana menunggu cocok
await membagi fungsi menjadi dua. Segala sesuatu sebelum berjalan secara sinkron, dan segala sesuatu setelahnya dijadwalkan sebagai tugas mikro. Hal ini mengejutkan banyak orang:
async function task() {
console.log("A before await");
await null;
console.log("C after await");
}
task();
console.log("B after calling task");
// A before await
// B after calling task
// C after await
Fungsi async tidak dimulai di latar belakang. Ini berjalan di thread yang sama hingga mencapai thread pertamanya await. Hal itu pun berlaku ketika menunggu sesuatu yang bukan janji nyata, seperti null. Lihat Panduan async/await JavaScript kami untuk mengetahui lebih lanjut tentang sintaksis ini.
Memblokir loop
Saat kode sinkron berjalan, tidak ada hal lain yang bisa. Untuk menunjukkan hal ini, kami menyetel timer ke 0 ms, lalu membiarkan thread sibuk selama setengah detik:
const start = Date.now();
setTimeout(() => console.log("timer ran after", Date.now() - start, "ms"), 0);
while (Date.now() - start < 500) {}
// timer ran after about 500 ms
Penundaan pengatur waktu adalah minimum, bukan jaminan. Itu berjalan hanya ketika tumpukan menjadi bebas. Pada halaman web, loop panjang seperti ini berarti klik tidak merespons dan animasi berhenti. Di server, setiap permintaan lainnya harus menunggu, itulah sebabnya satu panggilan sinkron yang lambat dapat merugikan semua pengguna proses Node.js.
Penyebab umum pemblokiran mencakup loop besar, penguraian JSON yang sangat besar, fungsi file sinkron seperti readFileSync dalam penangan permintaan, dan ekspresi reguler yang sangat buruk.
Kiat: Di Chrome DevTools, panel Performa menandai tugas yang berdurasi lebih dari 50 mdtk sebagai tugas berdurasi panjang. Ini adalah cara cepat untuk mengetahui apa yang membuat halaman terasa lamban.
Tetap responsif
Untuk pekerjaan berat, berikan kesempatan pada loop acara untuk bernafas. Salah satu caranya adalah dengan sesekali menjeda pengatur waktu, yang memungkinkan tugas lain berjalan:
const items = [0, 1, 2, 3, 4];
async function processAll() {
for (const item of items) {
if (item === 2) await new Promise((r) => setTimeout(r, 0));
console.log("item", item);
}
}
setTimeout(() => console.log("other work gets a turn"), 0);
processAll();
// item 0
// item 1
// other work gets a turn
// item 2
// item 3
// item 4
Pengatur waktu yang lain berjalan di tengah-tengah, karena kami menyerah dengan tugas yang sebenarnya. Kode sebenarnya akan menghasilkan banyak item atau milidetik. Untuk pekerjaan yang benar-benar membutuhkan CPU, seperti pemrosesan gambar, gunakan Web Worker di browser atau thread pekerja di Node.js, yang berjalan di thread terpisah.
Kelaparan tugas mikro
Karena loop mengosongkan antrian tugas mikro sepenuhnya sebelum melanjutkan, tugas mikro yang membuat penjadwalan lebih banyak dapat menghentikan semuanya. Kami mengujinya dengan 100.000 tugas mikro berantai:
let count = 0;
let timerFired = false;
setTimeout(() => { timerFired = true; }, 0);
function spin() {
count++;
if (count < 100000) queueMicrotask(spin);
else console.log("timer fired during microtasks?", timerFired);
}
queueMicrotask(spin);
// timer fired during microtasks? false
Pengatur waktu tidak dapat berjalan sampai semuanya selesai. Jika rantai itu tidak pernah berakhir, pengatur waktu tidak akan pernah menyala, dan di browser, halaman tersebut tidak akan pernah dicat ulang. Perhatikan bahwa menyerah dengan await pada janji yang diselesaikan tidak membantu di sini, karena itu hanya menambah tugas mikro lainnya. Anda memerlukan tugas nyata, seperti pengatur waktu, untuk memberi giliran kepada orang lain.
Rendering di browser
Browser biasanya mendapat kesempatan untuk melukis di antara tugas-tugas. Itu menjelaskan bug umum:
spinner.hidden = false;
doHeavyWork(); // blocks the thread
spinner.hidden = true;
Pemintal tidak pernah muncul, karena browser tidak mempunyai kesempatan untuk merender yang tersirat di antara baris-baris tersebut. Untuk memperbaikinya, biarkan kerangka lewat sebelum pekerjaan berat dimulai, atau pindahkan pekerjaan tersebut ke pekerja. Untuk kode yang mengubah visual, requestAnimationFrame dijalankan tepat sebelum pengecatan berikutnya, yang menjadikannya alat yang tepat untuk animasi.
Perbedaan Node.js
Node.js memiliki loop peristiwanya sendiri dengan beberapa fase, termasuk pengatur waktu, polling I/O, dan setImmediate. Ia juga memiliki process.nextTick, yang berjalan dalam antriannya sendiri. Inilah yang kami lihat saat menjalankannya dari dalam fungsi async:
setTimeout(() => console.log("timeout"), 0);
setImmediate(() => console.log("immediate"));
process.nextTick(() => console.log("nextTick"));
Promise.resolve().then(() => console.log("promise"));
// promise
// nextTick
// immediate
// timeout
Banyak artikel menyatakan bahwa nextTick selalu mengalahkan janji, dan pengatur waktu mengalahkan setImmediate. Hasil kami menunjukkan bahwa ini tidak sesederhana itu. Kode kami sudah berjalan dalam tugas mikro, jadi antrean janji dijalankan terlebih dahulu. Dan urutan setTimeout dan setImmediate diketahui bervariasi tergantung dari mana mereka dipanggil. Jadi jangan menulis kode yang bergantung pada urutan pastinya. Jika satu hal harus terjadi setelah hal lain, rangkai secara eksplisit.
Kuis wawancara
Cobalah untuk menyusun urutannya sebelum Anda membaca jawabannya:
console.log("a");
setTimeout(() => console.log("b"), 0);
Promise.resolve().then(() => {
console.log("c");
setTimeout(() => console.log("d"), 0);
Promise.resolve().then(() => console.log("e"));
});
console.log("f");
Proses kami mencetak a, f, c, e, b, d. Inilah alasannya:
adanfsinkron, sehingga dijalankan terlebih dahulu.- Tumpukannya kosong, jadi tugas mikro dijalankan:
c, lalu tugas mikro barue, di babak yang sama. - Sekarang satu tugas: pengatur waktu
b, yang diantrekan terlebih dahulu. - Kemudian tugas berikutnya: pengatur waktu
d, yang diantrekan selama tugas mikro.
Kesalahan umum
- Berpikir
setTimeoutadalah tepat. Penundaannya hanya minimum. - Berpikir
asyncberarti thread lain. Kode asinkron masih berjalan di thread utama di antara menunggu. - Menggunakan mode tidur untuk memperbaiki pengurutan. Menunggu kondisi sebenarnya jauh lebih dapat diandalkan, yang juga berlaku untuk pengujian tidak stabil.
- Menggunakan
forEachdenganawait. Tidak menunggu antar item. Lihat Metode array JavaScript. - Melakukan pekerjaan sinkron berat di pengendali server. Satu permintaan dapat menunda setiap permintaan lainnya.
Penutup
Ingat aturan intinya: jalankan tumpukan hingga kosong, jalankan semua tugas mikro, lalu jalankan satu tugas, dan ulangi. Segala sesuatu yang lain mengikuti darinya. Untuk membuatnya melekat, tulis kuis versi Anda sendiri di atas, prediksi hasilnya di atas kertas, lalu jalankan. Melakukan kesalahan dan memahami alasannya akan mengajari Anda lebih dari sekadar diagram apa pun.
Pertanyaan yang sering diajukan
Apa yang dimaksud dengan perulangan peristiwa dalam JavaScript?
Ini adalah mekanisme yang menjalankan panggilan balik dalam antrian ketika tumpukan panggilan kosong. Ini memungkinkan JavaScript thread tunggal menangani pengatur waktu, input, dan respons jaringan tanpa pemblokiran.
Apa perbedaan antara tugas mikro dan tugas?
Tugas mikro, seperti panggilan balik janji, semuanya dijalankan segera setelah tumpukan dikosongkan. Tugas, seperti pengatur waktu, dijalankan satu per satu, dan tugas mikro dikosongkan setelah setiap tugas.
Mengapa setTimeout dengan 0 tidak langsung berjalan?
Panggilan baliknya harus menunggu giliran tugas. Semua kode sinkron dan tugas mikro dijalankan terlebih dahulu, dan penundaannya adalah waktu minimum, bukan waktu yang tepat.
Apakah JavaScript berulir tunggal?
Kode JavaScript utama Anda berjalan di satu thread. Browser dan Node.js menggunakan thread lain untuk beberapa pekerjaan latar belakang, dan pekerja memungkinkan Anda menjalankan kode secara paralel.
Apakah menunggu memblokir loop acara?
Tidak. menunggu hanya menjeda fungsi async tersebut, dan kode lain dapat berjalan sementara itu. Kode sinkron yang panjang sebelum atau sesudahnya masih dapat memblokir loop.
Teruslah belajar
Butuh bantuan dengan pengujian, WordPress atau SEO?
Kami membantu tim mengirimkan perangkat lunak yang lebih baik dan mengembangkan situs mereka. Beritahu kami apa yang sedang Anda kerjakan dan kami akan menyarankan langkah selanjutnya yang jelas.
Panduan lebih lanjut tentang pengujian, AI & pengembangan modern
Menikmati artikel ini? Pilih topik dan langsung masuk ke tutorial terbaru kami.
Penjelasan Halusinasi AI: Mengapa Model Bahasa Memperbaiki Masalah dan Cara Menguranginya
Halusinasi AI menjelaskan: apa itu, mengapa model bahasa memproduksinya, tipe umum, cara menguranginya dengan landasan dan petunjuk, dan pemeriksaan…
Baca artikel →DevOpsPenjelasan Variabel Lingkungan: File .env, Rahasia, dan Konfigurasi Dilakukan dengan Benar
Variabel lingkungan dijelaskan dengan contoh Python yang kami jalankan: membaca dan mengaturnya, mengapa setiap nilai berupa string, file .env, pewa…
Baca artikel →Pengembangan perangkat lunakPenjelasan Pembatasan Kecepatan API: Algoritma, Header, dan Penanganan 429 Kesalahan
Pembatasan laju API dijelaskan dengan simulasi yang kami jalankan: keranjang token, jendela tetap, jendela geser, respons 429, header batas laju, pe…
Baca artikel →Otomatisasi pengujianMengejek dengan Python: unittest.mock, patch dan Kesalahan yang Membuat Tes Berbohong
Mengejek dengan Python dengan unittest.mock, menguji: Mock dan return_value, side_effect, menambal di mana nama digunakan, spesifikasi dan autospec,…
Baca artikel →Pengujian perangkat lunakPenjelasan Cakupan Kode: Cakupan Jalur vs Cabang dan Apa Arti 100% Sebenarnya
Cakupan kode dijelaskan dengan coverage.py yang sebenarnya dijalankan: cakupan garis, cabang dan kondisi, membaca laporan, mengapa cakupan 100% masi…
Baca artikel →Basis data & SQLDELETE vs TRUNCATE vs DROP dalam SQL: Perbedaan, Rollback dan Kapan Menggunakan Masing-Masing
DELETE vs TRUNCATE vs DROP dijelaskan dengan SQL yang diuji: apa yang dihapus, rollback, pemicu, reset identitas, kecepatan, dan perbedaan PostgreSQ…
Baca artikel →Basis data & SQLPenjelasan Tampilan SQL: Membuat, Menggunakan, dan Menghindari Kesalahan, Dengan Contoh
Tampilan SQL dijelaskan dengan kueri yang kami jalankan: membuat tampilan, hasil langsung, menyembunyikan kolom, kinerja, tampilan yang dapat diperb…
Baca artikel →Pengembangan perangkat lunakAntarmuka TypeScript vs Tipe: Perbedaan Nyata, Diuji Dengan Kompiler
Antarmuka TypeScript vs tipe, diperiksa dengan kompiler sebenarnya: apa yang bisa dilakukan keduanya, apa yang hanya bisa dilakukan satu orang, peng…
Baca artikel →Pengembangan perangkat lunakPenjelasan Python *args dan **kwargs: Fungsi Fleksibel Dengan Contoh Jelas
Python *args dan **kwargs dijelaskan dengan kode yang kami jalankan: pengepakan dan pembongkaran, urutan parameter, argumen hanya kata kunci dan pos…
Baca artikel →Pengembangan perangkat lunakFungsi Python Lambda: Sintaks, Kegunaan Sebenarnya, dan Kapan Tidak Digunakan
Fungsi python lambda dijelaskan dengan kode yang kami jalankan: sintaksis, pengurutan dengan kunci, peta dan filter, penutupan, jebakan pengikatan a…
Baca artikel →Kecerdasan buatanApa Itu Agen AI? Cara Kerjanya, Dengan Agent Loop Sederhana yang Dapat Anda Jalankan
Apa itu agen AI? Panduan sederhana tentang loop agen, alat, memori, dan pagar pembatas, dengan loop Python kecil yang kami jalankan, risiko nyata da…
Baca artikel →DevOpsPemantauan vs Observabilitas: Perbedaan Nyata, Dengan Log, Metrik, dan Jejak
Penjelasan pemantauan vs observabilitas: kegagalan yang diketahui dan tidak diketahui, log, metrik dan jejak, penelusuran insiden checkout, sinyal e…
Baca artikel →DevOpsVolume Docker vs Bind Mounts: Pertahankan Data Kontainer dengan Cara yang Benar
Volume Docker vs pengikatan pengikat dijelaskan: mengapa data kontainer menghilang, volume yang diberi nama, pengikatan pengikatan, tmpfs, contoh Tu…
Baca artikel →Otomatisasi pengujianTDD vs BDD: Perbedaan Utama, Satu Fitur Dibangun dengan Dua Cara dan Kapan Menggunakan Masing-masing
TDD vs BDD dijelaskan dengan satu fitur diskon yang dibuat dengan dua cara: refactor merah-hijau dengan kode yang kami jalankan, skenario Mengingat-…
Baca artikel →Pengujian perangkat lunakUser Acceptance Testing (UAT): Proses, Checklist dan Contoh Nyata
Pengujian penerimaan pengguna menjelaskan: siapa yang menjalankannya, perbedaannya dengan QA, proses tujuh langkah, templat kasus uji UAT, daftar pe…
Baca artikel →Basis data & SQLPenjelasan Nilai NULL SQL: IS NULL, COALESCE, NULLIF dan Jebakan yang Harus Dihindari
Nilai SQL NULL dijelaskan dengan kueri yang kami jalankan: logika tiga nilai, IS NULL, COALESCE, NULLIF, cara agregat, penggabungan, dan pengurutan …
Baca artikel →Basis data & SQLPernyataan SQL CASE WHEN: Sintaks, Contoh Nyata dan Kesalahan Umum
SQL CASE KETIKA dijelaskan dengan kueri yang kami jalankan: formulir sederhana dan dicari, urutan kondisi, pivot dengan SUM, trik COUNT, pengurutan …
Baca artikel →Pengembangan perangkat lunakApa itu JWT? Token Web JSON Dijelaskan Dengan Contoh Kerja
Apa itu JWT? JSON Web Tokens menjelaskan: tiga bagian, token yang dibuat dan dirusak dalam kode yang kami jalankan, sesi JWT vs, penyimpanan, token …
Baca artikel →Pengembangan perangkat lunakPenjelasan Loop Acara JavaScript: Call Stack, Microtasks, dan Timer Dengan Contoh
Perulangan peristiwa JavaScript dijelaskan dengan kode yang kami jalankan: tumpukan panggilan, antrian tugas dan tugas mikro, mengapa setTimeout 0 t…
Baca artikel →Pengembangan perangkat lunakGenerator Python dan Penjelasan Hasil: Menghemat Memori Dengan Contoh Nyata
Generator dan hasil Python dijelaskan dengan kode yang kami jalankan: bagaimana mereka menjeda dan melanjutkan, mengukur penghematan memori, saluran…
Baca artikel →Kecerdasan buatanApa itu Embedding? Kesamaan Vektor dan Kosinus Dijelaskan Secara Sederhana
Apa itu embeddings? Panduan bahasa sederhana tentang vektor, kesamaan kosinus, dan penelusuran semantik, dengan contoh kecil yang kami jalankan, pen…
Baca artikel →DevOpsPenerapan Biru-Hijau vs Canary: Perbedaan, Kompromi, dan Cara Memilih
Penjelasan penerapan blue-green vs canary: cara kerja masing-masing, biaya, risiko dan rollback, pengelompokan pengguna stabil yang kami uji, migras…
Baca artikel →Otomatisasi pengujianTes Tidak Stabil: Apa Penyebabnya dan Cara Memperbaikinya untuk Kebaikan
Pengujian yang tidak stabil dijelaskan dengan demo yang kami jalankan: penyebab utama, cara mengonfirmasi dan mendiagnosisnya, perbaikan waktu yang …
Baca artikel →Pengujian perangkat lunakLoad Testing vs Stress Testing: Perbedaan, Metrik dan Contoh k6
Penjelasan pengujian beban vs pengujian stres: apa yang dibuktikan masing-masing, pengujian lonjakan dan rendam, metrik yang penting, mengapa rata-r…
Baca artikel →Pengujian perangkat lunakKasus Uji vs Skenario Uji: Perbedaan Utama, Contoh, dan Kapan Menggunakan Masing-masing
Penjelasan kasus uji vs skenario pengujian: definisi yang jelas, tabel berdampingan, satu fitur pengaturan ulang kata sandi yang diambil dari skenar…
Baca artikel →Basis data & SQLOptimasi Kueri SQL: Baca Rencana Eksekusi dan Perbaiki Kueri Lambat, Dengan Pengaturan Waktu
Pengoptimalan kueri SQL diuji pada sejuta baris: membaca rencana eksekusi, menambahkan indeks yang tepat, memperbaiki filter yang tidak dapat disarg…
Baca artikel →Basis data & SQLSQL UNION vs UNION ALL: Perbedaan, Contoh dan Kinerja Diuji
SQL UNION vs UNION ALL dijelaskan dengan kueri yang kami jalankan: duplikat, aturan yang diikuti keduanya, bug data nyata, kinerja terukur, INTERSEC…
Baca artikel →Pengembangan perangkat lunakTutorial API Pengambilan JavaScript: GET, POST, Penanganan Kesalahan, dan Batas Waktu
Tutorial JavaScript Fetch API diuji pada server lokal: GET dan POST, mengapa 404 tidak muncul, bantuan yang dapat digunakan kembali, string kueri, b…
Baca artikel →Pengembangan perangkat lunakPenanganan File Python: Baca, Tulis, CSV, JSON dan pathlib Dengan Contoh
Penanganan file Python dijelaskan dengan kode yang kami jalankan: mode terbuka, dengan, membaca file besar, CSV, JSON, pathlib, file biner, penulisa…
Baca artikel →Pengembangan perangkat lunakKelas dan Objek Python: Tutorial OOP Dengan Contoh Nyata
Kelas dan objek Python dijelaskan dengan kode yang kami jalankan: __init__, metode, atribut kelas vs instance, warisan, properti, metode dunder, kel…
Baca artikel →Kecerdasan buatanApa Itu Model Bahasa Besar? Bagaimana LLM Bekerja, Dijelaskan Tanpa Hype
Apa yang dimaksud dengan model bahasa besar? LLM dijelaskan dalam bahasa sederhana: token, penyematan, perhatian, pelatihan, jendela suhu dan kontek…
Baca artikel →DevOpsPerintah Linux untuk Pemula: Panduan Terminal Penting Dengan Contoh
Perintah Linux untuk pemula, dikelompokkan berdasarkan tugas: navigasi, file, melihat log, grep, pipa, izin, proses dan arsip, dengan contoh analisi…
Baca artikel →Otomatisasi pengujianSelenium vs Penulis Drama: Perbedaan Utama, Perbandingan Kode, dan Mana yang Harus Dipilih
Selenium vs Playwright dibandingkan: arsitektur, menunggu, dukungan browser dan bahasa, debugging, pengujian yang sama di kedua alat, saran migrasi …
Baca artikel →Pengujian perangkat lunakPartisi Ekivalensi: Teknik Desain Tes Dijelaskan Dengan Contoh yang Dikerjakan
Penjelasan partisi ekivalensi: cara menemukan partisi yang valid dan tidak valid, contoh yang berfungsi untuk usia, kata sandi dan kupon, pengujian …
Baca artikel →Pengujian perangkat lunakSeverity vs Priority dalam Pengujian Perangkat Lunak: Perbedaan, Matriks dan Contoh Nyata
Keparahan vs prioritas dalam pengujian perangkat lunak dijelaskan: definisi yang jelas, matriks empat arah dengan contoh, skala level, siapa yang me…
Baca artikel →Basis data & SQLTutorial Subkueri SQL: Jenis, Subkueri yang Berkorelasi, dan ADA Dengan Contoh
Tutorial subkueri SQL dengan kueri yang kami jalankan: subkueri skalar, IN, FROM dan SELECT, subkueri yang berkorelasi, EXISTS, jebakan NOT IN NULL …
Baca artikel →Basis data & SQLPenjelasan Transaksi SQL dan ACID: COMMIT, ROLLBACK dan Tingkat Isolasi
Transaksi SQL dan ACID dijelaskan dengan transfer bank yang kami jalankan: COMMIT, ROLLBACK, savepoint, kunci, tingkat isolasi, pembacaan kotor, keb…
Baca artikel →Pengembangan perangkat lunakGit merge vs rebase: perbedaan, contoh, dan kapan memakai masing-masing
Git merge vs rebase dijelaskan dengan keluaran log nyata, tabel perbandingan, aturan emas rebase, dan alur kerja tim yang aman.
Baca artikel →Pengembangan perangkat lunakList Comprehension Python: Sintaks, Contoh, dan Kapan Harus Dihindari
List comprehension Python dijelaskan: sintaks, filter, if-else, perulangan bersarang, waktu yang diukur, dan kapan perulangan for biasa lebih baik.
Baca artikel →Basis data & SQLPenjelasan SQL JOIN dengan Contoh (Inner, Left, Right, Full)
Pahami SQL JOIN langkah demi langkah dengan tabel dan query contoh: INNER, LEFT, RIGHT, FULL, CROSS, dan SELF, plus kesalahan umum dan tips performa.
Baca artikel →