Preparation
πŸ’‘ ⏐ JavaScript Questions
18. Promises, promise chaining

Promise and Promise Chaining

In JavaScript, a promise is a good way to handle asynchronous operations. It is used to find out if the asynchronous operation is successfully completed or not.

Promises:

Promises are objects representing the eventual completion or failure of an asynchronous operation. They are a cleaner alternative to callback functions for handling asynchronous code. Promises have three states: pending, fulfilled, or rejected.

Creating a Promise:

const fetchData = new Promise((resolve, reject) => {
  // Simulating an asynchronous operation
  setTimeout(() => {
    const data = { name: "John", age: 30 };
    resolve(data); // Resolving the Promise with data
  }, 1000); // Simulating a delay of 1 second
});
 
fetchData.then((data) => {
  console.log(data); // Output: { name: "John", age: 30 }
});

In this example:

  • We create a new Promise fetchData.
  • Inside the Promise executor function, we perform an asynchronous operation (simulated with setTimeout).
  • When the operation is complete, we call resolve(data) to fulfill the Promise with the provided data.

Promise Chaining:

Promise chaining is a technique for handling multiple asynchronous operations in sequence. Each .then() call returns a new Promise, allowing you to chain operations together.

Example of Promise Chaining:

fetchData()
  .then((data) => {
    return processData(data); // Returns a Promise
  })
  .then((processedData) => {
    return fetchMoreData(processedData); // Returns a Promise
  })
  .then((moreData) => {
    console.log(moreData); // Output: Processed data from fetchMoreData
  })
  .catch((error) => {
    console.error(error); // Handling errors
  });

In this example:

  • We chain multiple .then() calls to handle the result of each asynchronous operation.
  • Each .then() returns a new Promise, allowing us to chain more asynchronous operations.
  • .catch() is used to handle any errors that occur during the Promise chain.

Benefits of Promise Chaining:

  1. Readability: Promise chaining makes asynchronous code more readable by allowing you to express sequential operations in a linear fashion.

  2. Error Handling: The .catch() method at the end of the chain allows you to handle errors in a centralized manner, making error handling more manageable.

  3. Flattened Code: Promise chaining helps avoid callback hell by flattening the code structure, making it easier to understand and maintain.