sleep
javacript

What is the JavaScript version of sleep()?

Master System Design with Codemia

Enhance your system design skills with over 120 practice problems, detailed solutions, and hands-on exercises.

Introduction

JavaScript does not have a normal built-in sleep() function that blocks execution the way some other languages do. The usual JavaScript answer is not "pause this thread completely," but "return a promise that resolves later" and await it inside async code.

Why JavaScript does not use a normal blocking sleep

In browsers and in most Node.js application code, JavaScript runs on an event loop. If a normal blocking sleep() existed on the main thread, it would freeze:

  • UI updates in the browser
  • event handlers
  • timers
  • other async work

That is why the common "sleep" pattern in JavaScript is really a delay helper built on setTimeout.

The standard Promise-based sleep

The usual helper is:

javascript
function sleep(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

This does not block the event loop. It creates a promise that resolves after the given number of milliseconds.

Used with await:

javascript
1function sleep(ms) {
2  return new Promise((resolve) => setTimeout(resolve, ms));
3}
4
5async function example() {
6  console.log("start");
7  await sleep(2000);
8  console.log("2 seconds later");
9}
10
11example();

That is the closest thing to sleep() that most JavaScript code should use.

Use it only inside async code

await works only inside an async function or in environments that support top-level await.

javascript
1function sleep(ms) {
2  return new Promise((resolve) => setTimeout(resolve, ms));
3}
4
5async function run() {
6  console.log("before");
7  await sleep(1000);
8  console.log("after");
9}
10
11run();

If you are outside async code, use .then():

javascript
1function sleep(ms) {
2  return new Promise((resolve) => setTimeout(resolve, ms));
3}
4
5console.log("waiting");
6sleep(1000).then(() => {
7  console.log("done");
8});

This is still asynchronous. The code after sleep(...) does not wait automatically unless you chain or await the promise.

Sleeping in loops

A very common use case is delaying between iterations.

javascript
1function sleep(ms) {
2  return new Promise((resolve) => setTimeout(resolve, ms));
3}
4
5async function countDown() {
6  for (let i = 3; i >= 1; i--) {
7    console.log(i);
8    await sleep(1000);
9  }
10  console.log("go");
11}
12
13countDown();

Notice that the await is inside the loop. If you forget it, all iterations run immediately and the delays do not affect the loop the way you expect.

A delay is not the same as true blocking sleep

This distinction matters:

  • 'await sleep(1000) pauses one async function'
  • it does not block the whole JavaScript runtime

Other timers, UI work, and queued tasks can still run during that second. That is usually exactly what you want.

For example:

javascript
1function sleep(ms) {
2  return new Promise((resolve) => setTimeout(resolve, ms));
3}
4
5async function demo() {
6  console.log("A");
7  setTimeout(() => console.log("timer fired"), 500);
8  await sleep(1000);
9  console.log("B");
10}
11
12demo();

The timer still fires before "B", proving the runtime was not globally blocked.

What about truly blocking sleep

There are edge-case ways to block in some JavaScript environments, such as Atomics.wait in restricted situations. That is not the normal answer to this question, and it is generally a bad idea for application code on the main thread.

If your real requirement is "wait without freezing everything," use the Promise-based helper.

If your real requirement is "throttle work," "retry later," or "delay between requests," the same helper still applies, but the surrounding design may matter more than the helper itself.

Use built-in alternatives when they fit better

Sometimes you do not even need a custom sleep helper. In Node.js, newer promise-friendly timer APIs may already express the intent clearly. But conceptually, they still do the same thing: they schedule completion later instead of blocking the thread now.

The important mental model is not "JavaScript has no sleep, so I need a hack." The important model is "JavaScript uses async delays instead of blocking sleep."

Common Pitfalls

The biggest mistake is expecting sleep() to block all JavaScript execution. The common Promise-based version does not do that, and that is usually good.

Another issue is forgetting that await only works inside async code. A lot of "sleep does not work" confusion is really an async-structure problem.

Developers also write sleep(1000); without await or .then(). That starts the timer-backed promise but does not make later code wait for it.

Finally, do not use a delay helper as a substitute for proper event handling or synchronization. If the code needs to wait for a real condition, waiting on the condition is usually better than sleeping for an arbitrary amount of time.

Summary

  • JavaScript does not have a normal blocking sleep() on the main thread.
  • The common JavaScript version of sleep is a Promise wrapper around setTimeout.
  • Use await sleep(ms) inside async functions.
  • This pauses one async function, not the entire event loop.
  • If the real requirement is coordination rather than delay, a real event or state check is often better than sleeping.

Course illustration
Course illustration

All Rights Reserved.