You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Promises, Async/Await, and JavaScript Behind the Scenes
Promises
// setTimeout examplesetTimeout(function(){console.log("Hello1");},1000);setTimeout(function(){console.log("Hello2");},1000);// What will be the output of this code? & why?// How to solve this problem?
// Nested setTimeout example (callback hell)setTimeout(function(){console.log("Hello1");setTimeout(function(){console.log("Hello2");setTimeout(function(){console.log("Hello3");setTimeout(function(){console.log("Hello4");},1000);},1000);},1000);},1000);// which time should change to make Hello 3 take 2000ms?// This is called (callback hell), that's why we use promises
// Promise examplenewPromise((resolve,reject)=>{constsuccess=false;if(success){resolve();}else{reject();}}).then(()=>{console.log("Call then");}).catch(()=>{console.log("Call catch");});// What will happen if we swap the resolve with reject?// We can assign this promise to a variable and use it later
letp=newPromise((resolve,reject)=>{console.log("Start promise");constsuccess=false;if(success){console.log("Call resolve");resolve();}else{console.log("Call reject");reject();}});console.log("After promise");p.then(()=>{console.log("Call then");}).catch(()=>{console.log("Call catch");});// That means the resolve and reject are async
Output
Start promise
Call reject
After promise
Call catch
newPromise((resolve,reject)=>{setTimeout(()=>{console.log("Hello1");resolve();},1000);}).then(()=>{setTimeout(()=>{console.log("Hello2");},1000);});// Take care we don't put resolve in the last setTimeout
// Function using PromisefunctionmyPromise(){returnnewPromise((resolve,reject)=>{fetch("https://jsonplaceholder.typicode.com/posts").then((response)=>response.json()).then((data)=>{console.log(data);resolve(data);});});}
// replace new Promise with asyncasyncfunctionmyPromise(){fetch("https://jsonplaceholder.typicode.com/posts").then((response)=>response.json()).then((data)=>{console.log(data);returndata;});}
// Function using async/awaitasyncfunctionmyPromise(){constresponse=awaitfetch("https://jsonplaceholder.typicode.com/posts");constdata=awaitresponse.json();console.log(data);returndata;}
JavaScript Behind the Scenes
// Function call stack examplefunctionfirst(){console.log("first function starts");second();console.log("first function ends");}functionsecond(){console.log("second function starts");third();console.log("second function ends");}functionthird(){console.log("third function starts");console.log("third function ends");}first();// Let's see the output of this code and how it works behind the scenes
Event Loop and Task Queues
// Event loop exampleconsole.log("Start");setTimeout(()=>{console.log("Hello");},1000);console.log("End");// What will be the output of this code?// Change the time to 0
Script start
Script end
Microtask: Promise.then
Microtask: queueMicrotask
Macrotask: setTimeout
Challenge 2
console.log("Script start");setTimeout(()=>{console.log("Macrotask 1: setTimeout");Promise.resolve().then(()=>{console.log("Microtask: Promise in setTimeout");});queueMicrotask(()=>{console.log("Microtask: queueMicrotask in setTimeout");});},0);Promise.resolve().then(()=>{console.log("Microtask: Promise.then ");});queueMicrotask(()=>{console.log("Microtask: queueMicrotask 1");queueMicrotask(()=>{console.log("Microtask: queueMicrotask 2");});});setTimeout(()=>{console.log("Macrotask 2: setTimeout");},0);console.log("Script end");
Output
Script start
Script end
Microtask: Promise.then
Microtask: queueMicrotask 1
Microtask: queueMicrotask 2
Macrotask 1: setTimeout
Microtask: Promise in setTimeout
Microtask: queueMicrotask in setTimeout
Macrotask 2: setTimeout
Challege about async/await
newPromise((resolve,reject)=>{setTimeout(()=>{console.log("Hello1");resolve();},1000);}).then(()=>{setTimeout(()=>{console.log("Hello2");},1000);});// convert this code to async/await
Answer
functiondelay(ms){returnnewPromise((resolve)=>setTimeout(resolve,ms));}asyncfunctionmain(){awaitdelay(1000);// Wait for 1 secondconsole.log("Hello1");awaitdelay(1000);// Wait for another 1 secondconsole.log("Hello2");}main();