1. Need for Promises
When we send a network-request, we have to wait for some time to get response from the server.
But as JavaScript is a synchronous-language, it does not wait to receive a response after some time with normal function call.
Hence, Promises are introduced. Promises gives a promise to code written after it, to provide value after some time.
2. Promise Creation
Promise()
constructor is used for Promise creation.
Syntax
new Promise(Executor-Function) // returns "promiseObj"
Executor-Function
should take 'two functions' as parameters -
-
resolve()
- called when the asynchronous task completes and returns the 'result' -
reject()
- called when task is failed, and returns 'reason of failure' which is typically a 'error object'
const promise1 = new Promise((resolve, reject) => { // do something asynchronous // // resolve(someValue) // or // reject('reson for error') })
Example
const promise1 = new Promise((resolve, reject) => { setTimeout(() => { resolve('foo') }, 300) }) promise1.then((value) => { console.log(value); // foo }) console.log(promise1) // [object Promise]
3. Promise Consumption
const promise1 = new Promise() const res = promise1.then(res => res.json()).catch(err => console.log(err)); // .then() step after result is received // .catch() way to process error, if error happened // Chaining const res = promise1 .then(value1 => modify1(value1)) .then(value2 => modify2(value2)) .then(value3 => modify3(value3)) .catch(err => console.log(err))
4. Making functions returns a Promise
To provide a function with promise-functionality, have it return a promise-object
function myAsyncFunction(url) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest() xhr.open("GET", url) xhr.onload = () => resolve(xhr.responseText) xhr.onerror = () => reject(xhr.statusText) xhr.send() }); }
5. Async Functions
Async Functions are instances of the AsyncFunction
constructor, and await
keyword is permitted within them.
The async
and await
keywords enable asynchronous, promise-based behavior to be written in a cleaner style, avoiding the need to explicitly configure promise chains.
try{ } catch(e){ }
block is used to process fulfilled (try{}
) and failed (catch(e){}
) requests
// 1. function returning promise function resolveAfter2Seconds() { return new Promise(resolve => { setTimeout(() => { resolve('resolved'); }, 2000); }); } // 2. Async function async function asyncCall() { console.log('calling'); try { const result = await resolveAfter2Seconds(); console.log(result); // fulfilled } catch(err) { console.log(err) // rejected, or any other err } } asyncCall(); // expected output: "resolved"
Top comments (0)