Promises, Async/Await

đź“‘ Table of Contents

  1. Introduction
  2. Constructor for a Promise Object
  3. Core States of a Promise
  4. Consumers: then, catch
  5. Promise Static Methods
  6. Async/Await

Introduction

A Promise is a Javascript object that reprents the eventaul completion (or rejection) of an asynchronous operation and its resulting value.

Constructor for a Promise Object

let promise = new Promise((resolve, reject) => { // Executor Code Here })

The function passed to the new Promise is called executor. When new Promise is created, the executor runs automatically. It contains the producing code whch eventually produce the result.

Example

const promise = new Promise((resolve, reject) => { // Async operation setTimeout(() => { resolve("Success!"); // reject("Failed!"); }, 1000); });

In case something goes wrong, the executor should call reject. That can be done with any type of argument (just like resolve). But it is recommended to use Error objects (or objects that inherit from Error). Like below:

const promise = new Promise((resolve, reject) => { // Async operation setTimeout(() => { reject(new Error('Something went wrong..')); }, 1000); });

Core States of a Promise

Consumers: then, catch

When the executor code in Promise either resolve or rejects, we have to register the consumers like then and catch to receive the result (if resolved) or error (if rejected) respectively.

.then

Syntax is:

promise.then( (result) => {/* Handle Success */}, (error) => {/* Handle Error */} );

Example-1

let promise = new Promise((resolve, reject) => { setTimeout(() => resolve('done'), 1000); }) promise.then( (result) => console.log(result), // Prints 'done' (error) => console.log(error), // Won't run )

Similarly,

Example-2

let promise = new Promise((resolve, reject) => { setTimeout(() => reject('error'), 1000); }) promise.then( (result) => console.log(result), // Won't run (error) => console.log(error), // Prints 'error' )
promise.then( (result) => console.log(result), // Runs only when Promise resolved means succeeded )

.catch

promise.catch( (error) => console.log(error) // Runs when promise is rejected. )

.finally

promise.finally( () => console.log('I will run always') // Runs always. )

Example-3

const promise = new Promise((resolve, reject) => { setTimeout(() => { resolve("Success!"); }, 1000); }); promise .then((result) => console.log(result)) .catch((error) => console.log(error)) .finally(() => console.log('Cleanup')) // Output: // Success! // Cleanup

Promise Static Methods (used on Promise class)

Promise.resolve(value)

Promise.resolve(5).then(console.log); // 5

Promise.reject(error)

Promise.reject("Error!").catch(console.error); // "Error!"

Promise.all(iterable)

Promise.all([ Promise.resolve(1), Promise.resolve(2), Promise.resolve(3) ]).then(console.log); // [1, 2, 3]

Promise.allSettled(iterable)

Promise.allSettled([ Promise.resolve("OK"), Promise.reject("ERROR"), ]).then((result) => console.log(result)) // ['OK', 'ERROR']

Promise.race(iterable)

Promise.race([ new Promise(res => setTimeout(() => res("First"), 100)), new Promise(res => setTimeout(() => res("Second"), 200)) ]) .then(console.log); // "First"

Promise.any(iterable)

Promise.any([ Promise.reject("fail"), Promise.resolve("success"), Promise.reject("fail again") ]) .then((result) => console.log(result)); // "success"

Async/Await

Async Functions

const myFunc = async () => {} // Async function // or async function myFunc() { // Async function }

Await

Example-4

const func = async () => { try { let promise = new Promise((resolve, reject) => { setTimeout(() => resolve('done'), 1000) }) let result = await promise; // Waits here until the promise resolves console.log(result); // done } catch(err) { console.log(err) } }