DEV Community

Emdadul Haque
Emdadul Haque

Posted on

Demystifying Promises in JavaScript : A Beginner’s Guide

What is a Promise?

A Promise is an object in JavaScript that represents the eventual completion (or failure) of an asynchronous operation and its resulting value. It allows you to write asynchronous code in a more manageable and readable way by handling success and error cases.

Using Promises: Creating and Handling

You can create a custom Promise instance to handle asynchronous tasks. Once you have a Promise, there are two main ways to handle its result or error:

  • Using .then() and .catch()
  • Using async/await with try/catch

Example:

function customPromise(condition) { return new Promise((resolve, reject) => { if (condition) { resolve("Success"); } else { reject("Failure"); } }); } 
Enter fullscreen mode Exit fullscreen mode

Instead of new Promise () instance we can use async/await , which acts the same.

Equivalent using async/await:

async function customPromise(condition) { if (condition) { return "Success"; // resolves } else { throw "Failure"; // rejects } } 
Enter fullscreen mode Exit fullscreen mode
  • return → resolves the Promise
  • throw → rejects the Promise

Handling promise with .then() and .catch()

customPromise(true) .then(result => console.log("Result:", result)) // If the Promise resolves, this block runs .catch(error => console.error("Error:", error)); // If the Promise rejects, this block runs 
Enter fullscreen mode Exit fullscreen mode

Handling promise with async/await and try/catch

async function handle() { try { const result = await customPromise(false); // If 'false', this will reject console.log("Result:", result); } catch (error) { console.error("Error:", error); // This catches the rejection reason } } handle(); 
Enter fullscreen mode Exit fullscreen mode

Built-in Promises

Many modern JavaScript APIs return Promises by default. For example, the fetch API used for network requests returns a Promise that resolves with the response object.

You can handle these Promises using the same techniques (async/await or .then()/.catch()) without needing to create them yourself.

async function fetchData() { try { const response = await fetch("https://api.example.com/data"); const data = await response.json(); console.log(data); } catch (error) { console.error("Fetch error:", error); } } fetchData(); 
Enter fullscreen mode Exit fullscreen mode

Other built-in Promise-returning APIs include:

  • Response.json() (parsing JSON from fetch response)
  • fs.promises methods in Node.js (readFile, writeFile, etc.)
  • Promise.all(), Promise.race(), Promise.resolve(), Promise.reject()
  • crypto.subtle API (Web Crypto)
  • cacheStorage methods in Service Workers

Built-in Asynchronous Functions Without Promises

Some built-in asynchronous functions, like setTimeout, execute tasks asynchronously but do not return Promises. Instead, they rely on callbacks to handle completion.

If you want to use them with Promises or async/await, you need to wrap these functions manually in a Promise.

function delay(ms) { return new Promise(resolve => { setTimeout(resolve, ms); }); } async function run() { await delay(1000); console.log("Waited 1 second"); } run(); 
Enter fullscreen mode Exit fullscreen mode

Other built-in asynchronous functions that use callbacks but do not return Promises:

  • setInterval() / clearTimeout() / clearInterval()
  • navigator.geolocation.getCurrentPosition()
  • XMLHttpRequest (older AJAX API)
  • Event listeners (addEventListener)
  • Node.js callback-based fs methods (fs.readFile, fs.writeFile, etc. without .promises)
  • process.nextTick() and setImmediate() in Node.js

Top comments (0)