TypeScript tidak punya sleep bawaan. Tulis fungsi yang mengembalikan Promise<void> yang di-resolve oleh setTimeout setelah jeda tertentu, lalu lakukan await padanya di dalam fungsi async:
await sleep(300) hanya menghentikan main. Programnya tidak membeku: timer, fungsi async lain, dan I/O tetap berjalan selama menunggu.
Cara Kerja Fungsi sleep
setTimeout(resolve, ms) menjadwalkan resolve untuk dipanggil setelah ms milidetik, dan memanggil resolve membuat promise itu selesai. await pada promise itu menangguhkan fungsi async sampai saat itu.
Argumen tipe <void> itu penting. new Promise(...) yang berdiri sendiri tidak menyimpulkan tipenya dari pemanggilan resolve, jadi tanpa argumen tipe itu sleep akan mengembalikan Promise<unknown>. Lalu void itulah yang mengizinkan resolve dipanggil tanpa nilai: di Promise<number>, resolve() tanpa argumen adalah error kompilasi. Kalau fungsinya punya tipe kembalian yang dideklarasikan, argumen tipe itu bisa ditaruh di sana:
setTimeout menjamin waktu minimum, bukan waktu yang tepat: callback-nya berjalan setelah jedanya lewat dan event loop sedang kosong. Perkirakan ada selisih beberapa milidetik.
Sleep di Dalam Perulangan
await sleep() di dalam loop for atau for...of memberi jeda di antara setiap iterasi, dan begitulah cara mengatur kecepatan kerja (batas rate, polling, animasi di terminal):
Cara ini tidak berhasil di dalam forEach: ia mengabaikan promise yang dikembalikan setiap callback async, jadi semua iterasi dimulai sekaligus dan tidak ada yang menunggu. Pakai loop for atau for...of, seperti yang dijelaskan di halaman async/await.
Mencoba Ulang dengan Jeda
Pemakaian nyata yang umum: coba sebuah operasi, dan kalau gagal, tunggu lalu coba lagi, dengan waktu tunggu dua kali lipat setiap kali (exponential backoff).
return await fn() di dalam try itu penting: tanpa await, promise yang reject akan dikembalikan sebelum catch sempat melihatnya.
sleep yang Bisa Dibatalkan
sleep biasa tidak bisa diinterupsi. Untuk berhenti menunggu lebih awal (pengguna menekan Batal, proses shutdown dimulai), kirim sebuah AbortSignal dan hapus timer-nya saat signal itu aktif:
Program langsung berhenti setelah abort karena timer yang panjang sudah dihapus. Tanpa clearTimeout, Node akan terus berjalan sampai 5 detik itu habis.
Timer Promise Bawaan Node
Node menyertakan versi promise dari setTimeout di module node:timers/promises, jadi di kode Node kamu bisa meng-import-nya alih-alih menulis helper sendiri. Fungsi itu juga menerima nilai untuk resolve dan sebuah AbortSignal:
import { setTimeout as sleep } from "node:timers/promises";
async function main() {
await sleep(1000); // wait one second
const result = await sleep(500, "done"); // resolves with "done"
const ac = new AbortController();
await sleep(10_000, undefined, { signal: ac.signal }); // cancellable
}
Tipenya berasal dari @types/node (npm i -D @types/node). Module ini tidak ada di browser, dan di sana helper satu baris tadi adalah pilihan yang portabel.
Tidak Ada sleep yang Memblokir
Bahasa yang punya thread memiliki sleep yang memblokir thread saat ini. JavaScript menjalankan kodemu di satu thread dengan event loop, jadi sleep yang memblokir akan membekukan semua hal lain: tidak ada timer yang berjalan, tidak ada response jaringan yang ditangani, dan di browser halamannya berhenti merespons. Perulangan sibuk yang terus berputar sampai jam melewati waktu tertentu melakukan persis hal itu, dan tidak pernah menjadi alat yang tepat.
sleep yang async adalah cara menunggu di JavaScript dan TypeScript: fungsinya ditangguhkan, thread-nya bebas, dan fungsi itu dilanjutkan saat timer selesai. Atomics.wait benar-benar bisa memblokir, tetapi hanya pada SharedArrayBuffer, dan browser melarangnya di main thread; fungsi itu ada untuk mengoordinasikan worker thread, bukan untuk jeda.
Pertanyaan yang sering diajukan
Bagaimana cara melakukan sleep di TypeScript?
Definisikan const sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms)); lalu panggil await sleep(1000) di dalam fungsi async. Fungsi itu berhenti sekitar satu detik tanpa memblokir bagian program yang lain.
Apakah ada fungsi sleep bawaan di TypeScript?
Tidak ada. TypeScript menambahkan tipe ke JavaScript dan tidak punya library runtime sendiri, sedangkan JavaScript tidak punya sleep. Di Node, kamu bisa meng-import-nya: import { setTimeout as sleep } from "node:timers/promises". Di browser, tulis helper satu baris itu.
Kenapa sleep butuh await?
sleep(1000) langsung mengembalikan promise; hanya await yang menghentikan fungsi async di sekitarnya sampai promise itu resolve. Tanpa await, baris berikutnya langsung dijalankan. await hanya bisa dipakai di fungsi async (atau di level teratas sebuah ES module).
Bisakah saya memblokir thread dengan sleep sinkron di TypeScript?
Tidak di kode biasa. JavaScript berjalan di satu thread dengan event loop, dan perulangan busy-wait membekukan semuanya: timer, callback jaringan, seluruh halaman. Pakai sleep yang async sebagai gantinya. Atomics.wait bisa memblokir thread di Node atau di worker, tetapi itu untuk koordinasi worker tingkat rendah, bukan untuk jeda.