DEV Community

Avnish
Avnish

Posted on • Edited on

How to Make JavaScript Sleep or Wait

JavaScript, being a single-threaded, asynchronous programming language, doesn’t have a built-in sleep() or wait() function like some other languages. However, with the use of setTimeout(), Promise, and async/await, you can simulate a sleep function effectively. This guide will show you how to achieve delays in your code.


The Problem with setTimeout()

The setTimeout() function allows you to schedule a task to execute after a specified delay. However, it doesn’t block code execution; instead, it queues the task asynchronously. For example:

setTimeout(() => console.log("Hello after 1 second"), 1000);
console.log("This runs immediately");
Enter fullscreen mode Exit fullscreen mode

Output:

This runs immediately
Hello after 1 second
Enter fullscreen mode Exit fullscreen mode

This asynchronous nature makes setTimeout() unsuitable for sequential delays unless managed carefully.


Creating a Sleep Function in JavaScript

1. Using Promise and async/await

The most robust way to create a sleep function is by leveraging Promise with async and await. This approach pauses the execution of asynchronous functions.

Example:

// Custom sleep function
const sleep = (delay) => new Promise((resolve) => setTimeout(resolve, delay));

// Using the sleep function
const delayedLog = async () => {
  await sleep(1000);
  console.log("First");
  await sleep(1000);
  console.log("Second");
  await sleep(1000);
  console.log("Third");
};

delayedLog();
Enter fullscreen mode Exit fullscreen mode

Explanation:

  1. sleep(delay) creates a Promise that resolves after delay milliseconds.
  2. await sleep(1000) pauses the execution until the promise resolves.
  3. This ensures sequential delays between console.log() statements.

Output:

First (after 1 second)
Second (after 2 seconds)
Third (after 3 seconds)
Enter fullscreen mode Exit fullscreen mode

2. Using Increasing Timeouts

Another approach is to use staggered setTimeout() calls with increasing delays.

Example:

setTimeout(() => console.log("First"), 1000);
setTimeout(() => console.log("Second"), 2000);
setTimeout(() => console.log("Third"), 3000);
Enter fullscreen mode Exit fullscreen mode

Explanation:

  • Each setTimeout() schedules a task with an increasing delay, ensuring sequential execution.

Output:

First (after 1 second)
Second (after 2 seconds)
Third (after 3 seconds)
Enter fullscreen mode Exit fullscreen mode

3. Sleep in Loops

Using async/await in Loops:

const sleep = (delay) => new Promise((resolve) => setTimeout(resolve, delay));

const loopWithSleep = async () => {
  for (let i = 1; i <= 3; i++) {
    await sleep(1000);
    console.log(`Iteration ${i}`);
  }
};

loopWithSleep();
Enter fullscreen mode Exit fullscreen mode

Output:

Iteration 1 (after 1 second)
Iteration 2 (after 2 seconds)
Iteration 3 (after 3 seconds)
Enter fullscreen mode Exit fullscreen mode

Using Increasing Timeouts in Loops:

for (let i = 1; i <= 3; i++) {
  setTimeout(() => console.log(`Iteration ${i}`), 1000 * i);
}
Enter fullscreen mode Exit fullscreen mode

Output:

Iteration 1 (after 1 second)
Iteration 2 (after 2 seconds)
Iteration 3 (after 3 seconds)
Enter fullscreen mode Exit fullscreen mode

Comparing the Methods

Method Pros Cons
async/await Clean, readable, and easy to use in complex flows. Requires knowledge of Promise and async.
Increasing Timeouts Simple, works without async/await. Less flexible for dynamic scenarios.

Best Practices

  1. Use async/await for complex workflows.
    • Ideal for scenarios requiring precise control over execution order.
  2. Use increasing timeouts for simple tasks.
    • Best for one-off delays without requiring reusability.

Conclusion

JavaScript doesn’t natively support a sleep() function, but you can easily mimic its behavior using Promise and setTimeout(). Depending on the use case, you can either implement a custom sleep function with async/await or leverage staggered timeouts for sequential delays. With these techniques, you can effectively introduce delays in your code while maintaining its readability and functionality.

Top comments (1)

Collapse
 
calmcarry23 profile image
CalmCarry

Since JavaScript doesn’t have a built-in sleep() function, using setTimeout or async/await with Promise is the best workaround. For real-world rest, though, a weighted blanket like CalmCarry can help you sleep better!