/

2024-07-02

Promises

PROMISES

Understanding Promises in JavaScript

Promises are a fundamental concept in JavaScript, particularly when dealing with asynchronous operations. They provide a more elegant and readable way to handle asynchronous tasks compared to traditional callback functions. In this blog post, we’ll explore what promises are, what they’re used for, and how to work with them using practical examples.

What is a Promise?

A Promise is an object representing the eventual completion or failure of an asynchronous operation. It’s essentially a placeholder for a value that will be available in the future. Promises help manage asynchronous code by allowing you to chain operations and handle errors more gracefully.

A promise can be in one of three states:

  1. Pending: The initial state, neither fulfilled nor rejected.
  2. Fulfilled: The operation completed successfully.
  3. Rejected: The operation failed.

Why Use Promises?

Promises make it easier to manage asynchronous operations by avoiding the „callback hell“ or „pyramid of doom“ that can occur with nested callbacks. They provide a cleaner, more readable structure for asynchronous code, enabling better error handling and chaining of multiple operations.

Basic Promise Usage

Here’s a basic example of creating and using a promise:

				
					


// Creating a Promise
let myPromise = new Promise((resolve, reject) => {
    let success = true; // Simulate a successful operation
    if (success) {
    resolve("Operation succeeded!");
    } else {
    reject("Operation failed!");
    }
    });
   
    // Consuming a Promise
    myPromise
    .then(result => {
    console.log(result); // "Operation succeeded!"
    })
    .catch(error => {
    console.error(error); // "Operation failed!"
    });
				
			

In this example, the promise is created with an executor function that takes two arguments: resolve and reject. If the operation is successful, resolve is called; otherwise, reject is called.

Chaining Promises

One of the powerful features of promises is the ability to chain them, allowing for sequential execution of asynchronous tasks:

				
					let promise1 = new Promise((resolve, reject) => {
    setTimeout(() => resolve("First operation completed!"), 1000);
});

promise1
    .then(result => {
        console.log(result);
        return new Promise((resolve, reject) => {
            setTimeout(() => resolve("Second operation completed!"), 1000);
        });
    })
    .then(result => {
        console.log(result);
        return new Promise((resolve, reject) => {
            setTimeout(() => resolve("Third operation completed!"), 1000);
        });
    })
    .then(result => {
        console.log(result);
    })
    .catch(error => {
        console.error(error);
    });

				
			

In this example, each .then() returns a new promise, allowing for the chaining of asynchronous operations. This ensures that each operation is performed sequentially.

Using async and await

ES8 introduced async and await keywords, which provide a more straightforward way to work with promises. They allow you to write asynchronous code in a synchronous manner, making it easier to read and write.

				
					// Example using async/await
async function asyncFunction() {
    try {
        let result1 = await new Promise((resolve, reject) => {
            setTimeout(() => resolve("First operation completed!"), 1000);
        });
        console.log(result1);

        let result2 = await new Promise((resolve, reject) => {
            setTimeout(() => resolve("Second operation completed!"), 1000);
        });
        console.log(result2);

        let result3 = await new Promise((resolve, reject) => {
            setTimeout(() => resolve("Third operation completed!"), 1000);
        });
        console.log(result3);
    } catch (error) {
        console.error(error);
    }
}

asyncFunction();

				
			

From the same category