DEV Community

Avnish
Avnish

Posted on

How to Make JavaScript Sleep or Wait

How to Make JavaScript Sleep or Wait: A Complete Guide

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 (0)