console.log('š Problem 1: Promise vs setTimeout');
async function asyncOrder() {
console.log('1');
setTimeout(() => {
console.log('2');
}, 0);
await Promise.resolve().then(() => console.log('3'));
console.log('4');
}
asyncOrder();
console.log('5');
console.log('\nš Problem 2: Multiple Awaits');
async function parallel() {
const promise1 = Promise.resolve('First');
const promise2 = Promise.resolve('Second');
const promise3 = await promise1;
console.log(promise3);
const promise4 = await promise2;
console.log(promise4);
}
async function concurrent() {
const [first, second] = await Promise.all([
Promise.resolve('First'),
Promise.resolve('Second')
]);
console.log(first);
console.log(second);
}
console.log('Start');
parallel();
console.log('End');
console.log('\nš Problem 3: Error Handling');
async function errorHandling() {
try {
console.log('1');
await Promise.reject('Error!');
console.log('2');
} catch (error) {
console.log('3');
} finally {
console.log('4');
}
console.log('5');
}
errorHandling();
console.log('6');
console.log('\nš Problem 4: Race Conditions');
async function raceCondition() {
const getData = () => new Promise(resolve =>
setTimeout(() => resolve('Data'), Math.random() * 100)
);
const results = [];
for (let i = 0; i < 3; i++) {
getData().then(result => results.push(result));
}
await Promise.all(results);
console.log(results);
const correctResults = await Promise.all(
Array(3).fill(null).map(() => getData())
);
console.log(correctResults);
}
raceCondition();
console.log('\nš Problem 5: Async Loop Trap');
async function asyncLoop() {
const items = [1, 2, 3];
items.forEach(async (item) => {
const result = await Promise.resolve(item * 2);
console.log(result);
});
console.log('Done forEach');
for (const item of items) {
const result = await Promise.resolve(item * 2);
console.log(result);
}
console.log('Done for...of');
}
asyncLoop();
console.log('\nš Problem 6: Return Value Trap');
async function returnValue() {
return await Promise.resolve('Done');
}
async function unnecessaryAwait() {
return await Promise.resolve('Done');
}
const result1 = returnValue();
const result2 = unnecessaryAwait();
console.log(result1);
console.log(result2);
console.log('\nš Problem 7: Async IIFE');
(async () => {
console.log('1');
await Promise.resolve();
console.log('2');
})();
console.log('3');
console.log('\nš Problem 8: Promise Chain vs Async/Await');
Promise.resolve('Start')
.then(result => {
console.log(result);
return 'Middle';
})
.then(result => {
console.log(result);
return 'End';
})
.then(result => {
console.log(result);
});
async function asyncChain() {
const start = await Promise.resolve('Start');
console.log(start);
const middle = await Promise.resolve('Middle');
console.log(middle);
const end = await Promise.resolve('End');
console.log(end);
}
console.log('\nš Problem 9: Concurrent vs Sequential');
async function sequential() {
console.time('sequential');
const first = await new Promise(r => setTimeout(() => r('first'), 1000));
const second = await new Promise(r => setTimeout(() => r('second'), 1000));
console.timeEnd('sequential');
return [first, second];
}
async function concurrent() {
console.time('concurrent');
const [first, second] = await Promise.all([
new Promise(r => setTimeout(() => r('first'), 1000)),
new Promise(r => setTimeout(() => r('second'), 1000))
]);
console.timeEnd('concurrent');
return [first, second];
}
console.log('\nš Problem 10: Event Loop Order');
async function eventLoop() {
console.log('1');
setTimeout(() => {
console.log('2');
}, 0);
new Promise(resolve => resolve('3'))
.then(console.log);
await Promise.resolve('4');
console.log('5');
queueMicrotask(() => {
console.log('6');
});
}
eventLoop();
console.log('7');