A Promise is a Javascript object that reprents the eventaul completion (or rejection) of an asynchronous operation and its resulting value.
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.
resolve
and reject
are callbacks provided by javascript.resolve(value)
- if the job is finished successfully, with result 'value'reject(error)
- if an error has occurred, error is the error object.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); });
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.
Syntax is:
promise.then( (result) => {/* Handle Success */}, (error) => {/* Handle Error */} );
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,
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(errorFunc)
, likepromise.catch( (error) => console.log(error) // Runs when promise is rejected. )
promise.finally( () => console.log('I will run always') // Runs always. )
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.resolve(5).then(console.log); // 5
Promise.reject("Error!").catch(console.error); // "Error!"
Promise.all([ Promise.resolve(1), Promise.resolve(2), Promise.resolve(3) ]).then(console.log); // [1, 2, 3]
Promise.allSettled([ Promise.resolve("OK"), Promise.reject("ERROR"), ]).then((result) => console.log(result)) // ['OK', 'ERROR']
Promise.race([ new Promise(res => setTimeout(() => res("First"), 100)), new Promise(res => setTimeout(() => res("Second"), 200)) ]) .then(console.log); // "First"
Promise.any([ Promise.reject("fail"), Promise.resolve("success"), Promise.reject("fail again") ]) .then((result) => console.log(result)); // "success"
async
before the function definition.const myFunc = async () => {} // Async function // or async function myFunc() { // Async function }
await
makes javascript wait until the promise settles and returns it result either value or error.await
works only inside the async functions.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) } }