⏳ How to Timeout a JavaScript Promise (with Code Examples)

⏳ How to Timeout a JavaScript Promise (with Code Examples)

Anmol KansalAnmol KansalMar 13, 20252 min read

When working with promises in JavaScript, you might run into scenarios where a promise hangs indefinitely. Maybe it's an API call that never resolves or a process that takes too long. In such cases, setting a timeout can save your app from freezing. Let’s see how to implement this!

📘 Basic Approach: Using Promise and setTimeout

Here’s a simple way to timeout a promise using setTimeout -

function withTimeout(promise, timeoutMs) {
  return new Promise((resolve, reject) => {
    const timer = setTimeout(() => {
      reject(new Error('Promise timed out'));
    }, timeoutMs);

    promise
      .then((result) => {
        clearTimeout(timer);
        resolve(result);
      })
      .catch((error) => {
        clearTimeout(timer);
        reject(error);
      });
  });
}

We know that a promise can only be rejected or resolved once. Here, we are simply rejecting the promise in timeoutMs if the promise does not get resolved before timeoutMs .

Example usage:

const myPromise = new Promise((resolve) => setTimeout(() => resolve('Done!'), 2000));

withTimeout(myPromise, 1000)
  .then((result) => console.log(result))
  .catch((error) => console.error(error.message));

Optimized Approach: Using Promise.race

We can simplify the implementation using Promise.race, which resolves/rejects with the first completed promise -

function withTimeout(promise, timeoutMs) {
  const timeoutPromise = new Promise((_, reject) =>
    setTimeout(() => reject(new Error('Promise timed out')), timeoutMs)
  );

  return Promise.race([promise, timeoutPromise]);
}

The timeout will reject the promise with an error if it takes longer than 1 second.

🚀 Wrapping Up

Timeouts are a powerful tool to handle slow or unresponsive promises, especially for API calls or user-driven interactions. By using either the manual approach with setTimeout or the elegant solution with Promise.race, you can easily add timeout functionality to any promise in your app.

Want to see more such utility functions or dive into advanced promise patterns? Let me know in the comments! 🧑‍💻

Tagged In

Anmol Kansal

Anmol Kansal

Senior Frontend Engineer @ D.E. Shaw

Full stack developer with 4+ years building scalable web products. I write about TypeScript, React, and frontend systems.

More posts