áá±á¬ááºážáá«ážáá±ážáá¬ážáá°ááẠJavaScript ááœáẠAsync/Await á ááá°áá¬áá»á¬ážááᯠáááºážá
á
áºáááºá áá±áá¯áá»á¡á¬ážááŒáá·áºá Async/Await ááẠasynchronous code áá±ážááẠá¡áááºááŒá±áá±á¬áááºážáááºážááŒá
áºáááºá á€á¡ááºá¹áá«áááºááá±á«áºáá®ááœááºá ááŒááºáááºáá±á«áºááá¯ááŸá¯áá»á¬ážááŸáá·áº ááááá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á ááá¯áá¯ááºááᯠáá±ážáá¬ážáá²á·áááºá áá°áááºážáá±á¬ááºážáá«ážááá¯áá±ážáá¬ážáá°ááẠá¥ááá¬á¡áá»áá¯ážáá»áá¯ážááá¯ááœá²ááŒááºážá
áááºááŒá¬ááŒááºážááŒáá·áº Async/Await áá¡á¬ážáá¬áá»ááºáá»á¬ážááá¯áá±á¬áºááŒáááºá
áá«ááá¯á·áááºážááá¯ááááá±ážááẠ"Habr" áá á¬áááºáá°á¡á¬ážáá¯á¶ážá¡ááœáẠ- "Habr" áááá¯ááá¯ážááŸááºážáá¯ááºááᯠá¡áá¯á¶ážááŒá¯á áááºááá·áº Skillbox áááºáááºážááœááºá á¬áááºážááœááºážááá·áºá¡áá« 10 áá°áááºáá»áŸá±á¬á·á á»á±ážá
Skillbox á០á¡ááŒá¶ááŒá¯áá¬ážáááº- ááá¬áá±ážá¡áœááºááá¯ááºážáááºáááºáž
"Java Developer" .
ááŒááºáá±á«áº
Callback ááẠá¡áá»áááºá¡ááá·áºá¡áááºáááŸá ááŸá±á¬áá·áºááŸá±ážáá±ááá·áº áá¯ááºáá±á¬ááºáá»ááºáá áºáá¯ááŒá áºáááºá ááááºáá ááááºáá»ááºáá»ááºážááááá¯ááºááá·áº ááá¯áá±áá¬áá»á¬ážááœáẠáá¯ááºážáá±á«áºááá¯ááŸá¯áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áá²á·áááºá
á€áááºááŸá¬ Node.js ááŸá ááá¯ááºáá áºáá¯ááᯠá¡áááºáááŒááºáááºááŸá¯ááŒááºážá á¥ááá¬áá áºáá¯ááŒá áºáááºá
fs.readFile(__filename, 'utf-8', (err, data) => {
if (err) {
throw err;
}
console.log(data);
});
áá
áºáá»áááºáááºážááœáẠá¡ááŒáá¯ááºá¡ááá¯ááºáá¯ááºáá±á¬ááºááŸá¯áá»á¬ážá
áœá¬ááᯠáá¯ááºáá±á¬ááºááẠááá¯á¡ááºáá±á¬á¡áá«ááœáẠááŒá¿áá¬áá»á¬áž ááŒá
áºáá±á«áºáá¬áá«áááºá á€áá¬ááºáááºážááᯠá
áááºáá°ážááŒáá·áºááŒáá«á
áá¯á·- Arfat á¡áá¯á¶ážááŒá¯áá° áá±áá¬áá±á·á
áºááœáẠáá±á¬ááºážááá¯áá»ááºáá
áºáᯠááŒá¯áá¯ááºáá¬ážááŒá®ážá áááºááẠáááºážá profile_img_url á¡ááœááºááᯠáááºááŒá®áž someserver.com áá¬áá¬á០áá¯á¶áá
áºáá¯á¶ááᯠáá±á«ááºážáá¯ááºáá¯ááºááẠááá¯á¡ááºáá«áááºá
áá±á«ááºážáá¯ááºáá¯ááºááŒá®ážáá±á¬ááºá á¥ááᬠPNG á០JPEG ááá¯á· áá¯á¶á¡á¬áž á¡ááŒá¬ážáá±á¬áºáááºááá¯á· ááŒá±á¬ááºážáá«áááºá ááŒá±á¬ááºážáá²ááŒááºážá¡á±á¬ááºááŒááºáá«áá á¡áá¯á¶ážááŒá¯áá°áá¡á®ážáá±ážááºááá¯á· á
á¬áá
áºá
á±á¬ááºáá±ážááá¯á·áááºá ááá¯á·áá±á¬ááºá áááºá
áœá²ááᯠááœáŸááºááŒáá±á¬ transformations.log ááá¯ááºáá²ááá¯á· á¡ááŒá
áºá¡áá»ááºááŸáá·áºáááºáááºááá·áº á¡áá»ááºá¡áááºááᯠááá·áºááœááºážáá«áááºá
áá¯ááºááá±á¬ááºáá¯á¶ážá¡ááá¯ááºážááœáẠááŒááºáááºáá±á«áºááá¯ááŸá¯áá»á¬ážá áááºáá±ááŸá¯ááŸáá·áº á¡áá±á¡ááœááºá¡áá»á¬ážá¡ááŒá¬ážááᯠá¡á¬áá¯á¶á áá¯ááºááẠááá¯ááºáááºáá«áááºá Callback Hell ááá¯á·ááá¯áẠPyramid of Doom áá¯áá±á«áºáááºá
á€áááºážáááºážá á¡á¬ážáááºážáá»ááºáá»á¬ážááŸá¬ áááá¬áááºááŸá¬ážáá«áááºá
- áá®áá¯ááºá áááºááááºáááºá
- áá¯ááºá¡áááºá¡ááœá±áž áá¶á·áá»ááºážá á±áááºááá·áº á¡ááŸá¬ážáá»á¬ážááᯠááá¯ááºááœááºáááºáááºáž áááºáá²áááºá
á€ááŒá¿áá¬ááá¯ááŒá±ááŸááºážááẠááááá»á¬ážááᯠJavaScript ááœáẠááá·áºááœááºážáá²á·áááºá áááºážááá¯á·ááẠááá·áºá¡á¬áž ááŒááºáá±á«áºááŒááºážá áááºáá²áá±á¬ á¡ááá¯ááºáá»á¬ážááᯠ. ááá¯á·áá±á¬áẠá áá¬ážáá¯á¶ážááŒáá·áº á¡á á¬ážááá¯ážááá¯ááºá á±áá«áááºá
áááááŒá¯áá»ááºáá»á¬ážá á¡ááŒá¯ááá±á¬áá±á¬ááºááá·áº ááŸá¯áá±á¬áá·áºááŸá¬ áááºážááá¯á·ááẠáááºááŸáá¬á០áá¬áááºááẠá¡áá±á«áºááŸá¡á±á¬ááºááŒá±á¡áá áá¯ááºááᯠááá¯ááá¯áááºááŸá¯ááá¯ááºá á±ááẠáááºáá®ážáá±ážááŒááºážááŒá áºáááºá ááá¯á·áá¬ááœááºá ááááá»á¬ážááŸá¬áááºáž ááŒá¿áá¬áá»á¬ážááŸááááºá
- á¡áá»á¬ážááŒá®ážááá·áºááááºá
- try/catch á¡á á¬áž .catch ááᯠá¡ááŸá¬ážá¡ááœááºážá¡á¬ážáá¯á¶ážááᯠááá¯ááºááœááºááŒá±ááŸááºážááẠá¡áá¯á¶ážááŒá¯áá«áááºá
- á ááºááá¯ááºážáá áºáá¯á¡ááœááºáž ááááá»á¬ážá áœá¬ááŒáá·áº áá¯ááºáá±á¬ááºááŒááºážááẠá¡ááŒá²áááºáž á¡áááºááŒá±áááºááá¯ááºáá«á á¡áá»áá¯á·ááá á¹á áá»á¬ážááœááºá áááºážááá¯á·ááẠáá¯ááºááᯠááŸá¯ááºááœá±ážá á±áááºá
á€áááºááŸá¬ áá±á¬ááºáá¯á¶ážá¡áá»ááºá á¡áááá¹áá«ááºááᯠáá±á¬áºááŒááá·áº ááŒá¿áá¬áá áºáá¯ááŒá áºáááºá
áá»áááºážááŒá¬ážáá¬ááá»á¬áž (0ân á áá¹ááá·áº) ááœáẠáá¶áá«ááºáá»á¬ážááᯠ10 á០0 á¡áá print áá¯ááºááá·áº for loop áá áºáá¯ááŸááááºááá¯áá«á áá¯á·á ááááá»á¬ážááá¯á¡áá¯á¶ážááŒá¯á ááááºážáá»á¬ážááᯠ0 á០10 á¡áá áááºááá¯ááºááá¯ááºááŸáááºááá¯ááºááẠá€ááœááºážáááºááᯠááŒá±á¬ááºážáá²ááẠááá¯á¡ááºáá«áááºá ááá¯á·ááŒá±á¬áá·áº áá¯ááá áºáá¯á¡á¬áž áááá·áºáá¯ááºááẠ6 á áá¹ááá·áºááŸáá·áº 2 á áá¹ááá·áºááŒá¬áá«á áá¯áááᯠáŠážá áœá¬ááá¯ááºááŸáááºááá·áºááŒá®ážá ááá¯á·áá±á¬áẠáá¯á¶ááŸáááºááŒááºážá¡ááœáẠááŸá áºáá áºááŒáá¯ááá¯ááœá² á áááºáá«áááºá
á€ááŒá¿áá¬ááá¯ááŒá±ááŸááºážááẠáá»áœááºá¯ááºááá¯á·ááẠAsync/Await ááá¯á·ááá¯áẠ.sort ááᯠá¡áá¯á¶ážáááŒá¯áá«á á¥ááá¬áá áºáá¯áá²á· á¡ááŒá±á á¡áá¯á¶ážááŸá¬á
Async áá¯ááºáá±á¬ááºáá»ááºáá»á¬áž
ES2017 (ES8) ááœáẠasync áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠáá±á«ááºážááá·áºááŒááºážááẠááááá»á¬ážááŸáá·áº áá¯ááºáá±á¬ááºááŒááºážá áá¯ááºáááºážáá¬áááºááᯠááá¯ážááŸááºážá á±áááºá async áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááẠááááá±á¬áºáá»á¬ážá âááááºááœááºâ á¡áá¯ááºáá¯ááºááŒá±á¬ááºáž áá»áœááºá¯ááºáááááŒá¯áááá«áááºá á€áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááẠá¡áááºá¡ááœá±ážá¡á ááœá²ááŒá¬ážáá±á¬ ááá±á¬ááá¬ážáá»á¬ážááᯠááá¯ááºá á¬ážáááŒá¯áá«á Async áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááẠáá¯ááºáá»á¬ážááᯠáá¯ááºáá»á¬ážá¡ááœáẠá¡á á¬ážááá¯ážáá áºáá¯á¡ááŒá Ạáááºááœááºáá«áááºá
Async/Await ááẠsynchronous á ááá¯ááºááŒáá·áº áá»áááºááá¯ááºááá·áº áá¯ááºááŒáá·áº á¡áá¯ááºáá»á¬ážááᯠá á¯á ááºážááá¯ááºá á±áááºá
ááá¯á·ááŒá±á¬áá·áº ááááá»á¬ážááᯠááááŸáááŒááºážá Async/Await á á¡ááŒá±áá¶áá°áá»á¬ážááᯠáá¬ážáááºááẠááá¯ááá¯ááœááºáá°á á±áááºá
syntax
áá¯á¶ááŸááºá¡á¬ážááŒáá·áº áááºážááœáẠáá±á¬á·áá»ááºá á¬áá¯á¶áž ááŸá áºáá¯áá«áááºáááº- async ááŸáá·áº wait. áááá áá¬ážáá¯á¶ážá function ááᯠasynchronous á¡ááŒá ẠááŒá±á¬ááºážáá²áá±ážáá«áááºá ááá¯ááá¯á·áá±á¬ áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááẠá á±á¬áá·áºáá»áŸá±á¬áºá¡áá¯á¶ážááŒá¯ááŒááºážááᯠááœáá·áºááŒá¯áá«áááºá á¡ááŒá¬ážáááºááá·áºááá á¹á ááœááºáááá¯á á€áá¯ááºáá±á¬ááºáá»ááºááá¯á¡áá¯á¶ážááŒá¯ááŒááºážááẠá¡ááŸá¬ážá¡ááœááºážáá áºáá¯ááŒá áºáá±á«áºáá¬áááºááŒá áºáááºá
// With function declaration
async function myFn() {
// await ...
}
// With arrow function
const myFn = async () => {
// await ...
}
function myFn() {
// await fn(); (Syntax Error since no async)
}
Async ááᯠfunction declaration áá¡á ááœáẠááá·áºááœááºážáá¬ážááŒá®áž â=â áááºá¹áá±áááŸáá·áº ááœááºážá á¥áºáá»á¬ážááŒá¬ážááœáẠááŒáŸá¬ážáá¯ááºáá±á¬ááºáá»ááºáá áºáá¯á¡ááœáẠááá·áºááœááºážáá¬ážáááºá
á€áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠáááºážáááºážáá»á¬ážá¡ááŒá Ạobject áá áºáá¯ááœáẠáá¬ážááŸáááá¯ááºááẠááá¯á·ááá¯áẠclass declaration ááœáẠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá
// As an object's method
const obj = {
async getName() {
return fetch('https://www.example.com');
}
}
// In a class
class Obj {
async getResource() {
return fetch('https://www.example.com');
}
}
NB class constructors ááŸáá·áº getters/setters áá»á¬ážááẠasynchronous áááŒá áºááá¯ááºááŒá±á¬ááºáž ááŸááºáá¬ážááá¯ááºáá«áááºá
á¡áááá¹áá«ááºááœáá·áºááá¯áá»ááºááŸáá·áº á á®áááºáá»ááºá ááºážáá»ááºážáá»á¬áž
Async áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááẠá¡ááŒá±áá¶á¡á¬ážááŒáá·áº áá¯á¶ááŸáẠJS áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááŸáá·áº áááºáá°áá±á¬áºáááºáž ááŒáœááºážáá»ááºááŸááá«áááºá
ááá¯á·ááŒá±á¬áá·áºá async áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááẠá¡ááŒá²áááºáž ááááá»á¬áž ááŒááºáá±ážáááº-
async function fn() {
return 'hello';
}
fn().then(console.log)
// hello
á¡ááá¡áá»ááŒá±á¬áááẠfn á hello ááá¯áá²á· á á¬ááŒá±á¬ááºážááᯠááŒááºáá±ážáá«áááºá áá±á¬ááºážááŒá®á áááºážááẠááŒááºááŒááºáá¬ážáá¬ážáá¯ááºáá±á¬ááºááŸá¯áá áºáá¯ááŒá áºáá±á¬ááŒá±á¬áá·áºá áááºáá±á¬ááºáá°á¡á¬áž á¡áá¯á¶ážááŒá¯á string áááºááá¯ážááᯠááááá áºáá¯ááŒáá·áº áá¯ááºááá¯ážáá¬ážáááºá
á€áááºááŸá¬ Async ááá«áá±á¬ á¡á á¬ážááá¯ážáá®ááá¯ááºážáá áºáá¯ááŒá áºáááºá
function fn() {
return Promise.resolve('hello');
}
fn().then(console.log);
// hello
á€ááá á¹á ááœááºá áááááᯠ"ááá¯ááºááá¯ááº" ááŒááºáá±ážáááºá á¡áááºáááŒááºáá¯ááºáá±á¬ááºááŸá¯áá áºáá¯ááẠáááá¡áá áºáá áºáá¯á á¡ááŒá²áá¯ááºááá¯ážáá¬ážáááºá
ááŒááºáá±ážááá·áºáááºááá¯ážááẠáá°áááŒá áºáá»áŸááºá async áá¯ááºáá±á¬ááºáá»ááºááẠááááá áºáá¯ááŒáá·áº áá¯ááºááá¯ážááŒááºážááŒáá·áº áááºááá¯ážááᯠááŒááºáá±ážáááºá ááŒááºáá±ážááá·áºáááºááá¯ážááẠááááá±ážáá¬ážááá·áºá¡áá¬áá áºáá¯ááŒá áºáá«áá áááºážááá¯á¶ážááŒááºáá»ááºááᯠáááá¡áá áºáá áºáá¯ááŒáá·áº ááŒááºáá±ážáááºá
const p = Promise.resolve('hello')
p instanceof Promise;
// true
Promise.resolve(p) === p;
// true
ááá¯á·áá±á¬áº asynchronous function ááœáẠerror áá áºáá¯ááŸááá»áŸáẠáá¬ááŒá áºááá¯ááºáááºáááºážá
async function foo() {
throw Error('bar');
}
foo().catch(console.log);
ááá¯ááºáá±á¬ááºáá«á foo() ááẠááŒááºážáááºááŒááºážááŸáá·áºá¡áá° ááááá áºáá¯ááŒááºáá±ážáá«áááºá á€á¡ááŒá±á¡áá±ááœááºá á¡ááŸá¬ážáá áºáá¯áá«ááŸááá±á¬ Promise.reject ááᯠPromise.resolve á¡á á¬áž ááŒááºáá±ážáá«áááºá
Async áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááẠááŒááºáá¬áááºááŒá áºá á± ááááá áºáᯠá¡ááŒá²áá¯ááºáá±ážáááºá
á á±á¬áá·áºáá»áŸá±á¬áºááá¯ááºážááœáẠAsynchronous áá¯ááºáá±á¬ááºáá»ááºáá»á¬áž áá±áá¹ááááºáááºá
á á±á¬áá·áºáá»áŸá±á¬áºááŒááºážááẠá¡áá¯á¶ážá¡ááŸá¯ááºážáá»á¬ážááᯠááááá¯ááºá á±áá«áááºá ááá¯á·ááŒá±á¬áá·áºá á áá¬ážáááºááẠááááá áºáá¯ááŒá áºáá«áá áááááááºááá»ááºáž async áá¯ááºáá±á¬ááºááŸá¯ááᯠááá¯ááºážáá¶á·áá¬ážáááºá á áá¬ážáááºááẠááááá áºáá¯ááá¯ááºáá«áá áááºážááᯠPromise.resolve ááŸáá áºááá·áº áááá¡ááŒá áºááá¯á· ááŒá±á¬ááºážáá²ááŒá®ážáá±á¬áẠááŒá®ážááŒá±á¬ááºáááºá
// utility function to cause delay
// and get random value
const delayAndGetRandom = (ms) => {
return new Promise(resolve => setTimeout(
() => {
const val = Math.trunc(Math.random() * 100);
resolve(val);
}, ms
));
};
async function fn() {
const a = await 9;
const b = await delayAndGetRandom(1000);
const c = await 5;
await delayAndGetRandom(1000);
return a + b * c;
}
// Execute fn
fn().then(console.log);
á€ááœáẠfn áá¯ááºáá±á¬ááºáá»ááºááá±á¬áºááŒáá»ááºááŒá áºáááºá
- áááºážááá¯áá±á«áºááá¯ááŒá®ážáá±á¬ááºá áááááá¯ááºážááẠconst a = await 9 ááŸááŒá±á¬ááºážáááºá in const a = wait Promise.resolve(9);
- Await ááᯠá¡áá¯á¶ážááŒá¯ááŒá®ážáá±á¬ááºá áááºážááááºááá¯ážááᯠáááŸááááºá¡áá áá¯ááºáá±á¬ááºáá»ááºááᯠááá¯ááºážáá¶á·áá¬ážááẠ(áááºááŸáá¡ááŒá±á¡áá±ááœáẠáááºážááẠ9) ááŒá áºáááºá
- delayAndGetRandom(1000) ááẠfn áá¯ááºáá±á¬ááºáá»ááºááᯠááŒá®ážááŒá±á¬ááºáááºá¡áá (1 á áá¹ááá·áºá¡ááŒá¬) áá±áá¹ááááºáááºá áááºážááẠfn áá¯ááºáá±á¬ááºáá»ááºááᯠ1 á áá¹ááá·áºá¡áá áááá±á¬ááºá áœá¬ áááºááá·áºá á±áááºá
- delayAndGetRandom(1000) ááẠááŒá±ááŸááºážááŸá¯ááŸáá áºááá·áº ááááºážááŸáẠb ááá¯á· áááºááŸááºáá±ážááá·áº áá»áááºážáááºááá¯ážááᯠááŒááºáá±ážáááºá
- áá±á¬ááºážááŒá®á variable c ááŸááá±á¬ case ááẠvariable a ááŸáááá·áº case ááŸáá·áº áááºáá°áááºá áááºážáá±á¬ááºá á¡áá¬á¡á¬ážáá¯á¶ážááẠáá áºá áá¹ááá·áºáá»áŸáááºááá·áºááœá¬ážáá±á¬áºáááºáž ááá¯á¡áá«ááœáẠááŸá±á¬áá·áºááŸá±ážááŒááºážAndGetRandom(1000) ááẠáááá¯á¡ááºáá±á¬ááŒá±á¬áá·áº áá¬ááŸááŒááºááá¬áá«á
- ááá¯á·ááŒá±á¬áá·áº áááºááá¯ážáá»á¬ážááᯠáá¯á¶áá±áááºáž a+b*c ááŒáá·áº ááœááºáá»ááºáá«áááºá ááááºááᯠPromise.resolve áá¯á¶ážááŒá®áž ááááá áºáá¯áá²á· áá¯ááºááŒá®áž áá¯ááºáá±á¬ááºáá»ááºá ááŒááºáá±ážáááºá
á€áá±áá¹ááááºááŒááºážáá»á¬ážááẠES6 ááŸá áá»ááºááá±áá¬áá»á¬ážááᯠá¡ááŸááºááá±ááá¯ááºáá±á¬áºáááºáž áááºážááœáẠáá
áºáá¯áá¯ááŸááá«áááºá
ááŒá¿áá¬ááŒá±ááŸááºážááŒááºážá
áá²á á¡áᯠá¡áááºááŸá¬ áá±á¬áºááŒáá²á·áá²á· ááŒá¿áá¬áá²á· á¡ááŒá±ááᯠááŒáá·áºááŒáá¡á±á¬ááºá
finishMyTask áá¯ááºáá±á¬ááºáá»ááºááẠqueryDatabaseá sendEmailá logTaskInFile ááŸáá·áº á¡ááŒá¬ážá¡áá¬áá»á¬ážáá²á·ááá¯á·áá±á¬ áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážá ááááºáá»á¬ážááᯠá á±á¬áá·áºááẠAwait ááᯠá¡áá¯á¶ážááŒá¯áááºá ááááá»á¬ážá¡áá¯á¶ážááŒá¯áá²á·ááá·áº á€ááŒá±ááŸááºážáá»ááºááŸáá·áº ááŸáá¯ááºážááŸááºáá«á áááºáá°ááá¯ážááŸá¬ážáá»á¬áž áááºááŸá¬ážáá¬áááºááŒá áºáááºá ááá¯á·áá±á¬áºá Async/Await áá¬ážááŸááºážááẠsyntactic ááŸá¯ááºááœá±ážááŸá¯áá»á¬ážááᯠáá»á¬ážá áœá¬ááá¯ážááŸááºážá á±áááºá á€ááá á¹á ááœááºá .then/.catch áá²á·ááá¯á·áá±á¬ ááŒááºáááºáá±á«áºááá¯ááŸá¯áá»á¬ážááŸáá·áº ááœááºážáááºáá»á¬áž á¡áá»á¬ážá¡ááŒá¬ážáááŸááá«á
á€ááœáẠááááºážáá»á¬ážá output ááŸáá·áº á¡ááŒá±áá áºáá¯ááẠááœá±ážáá»ááºá áᬠááŸá áºáá¯ááŸááá«áááºá
const wait = (i, ms) => new Promise(resolve => setTimeout(() => resolve(i), ms));
// Implementation One (Using for-loop)
const printNumbers = () => new Promise((resolve) => {
let pr = Promise.resolve(0);
for (let i = 1; i <= 10; i += 1) {
pr = pr.then((val) => {
console.log(val);
return wait(i, Math.random() * 1000);
});
}
resolve(pr);
});
// Implementation Two (Using Recursion)
const printNumbersRecursive = () => {
return Promise.resolve(0).then(function processNextPromise(i) {
if (i === 10) {
return undefined;
}
return wait(i, Math.random() * 1000).then((val) => {
console.log(val);
return processNextPromise(i + 1);
});
});
};
á€ááœáẠasync áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á ááŒá±ááŸááºážáá»ááºáá áºáá¯ááŒá áºáááºá
async function printNumbersUsingAsync() {
for (let i = 0; i < 10; i++) {
await wait(i, Math.random() * 1000);
console.log(i);
}
}
áá¯ááºáá±á¬ááºáá¬ááœáẠá¡ááŸá¬ážá¡ááœááºážááŸááááºá
ááá¯ááºááœááºáááŒá±ááŸááºážááá¯ááºáá±á¬ á¡ááŸá¬ážáá»á¬ážááᯠááŒááºážáááºáá¬ážáá±á¬ ááááá áºáá¯ááŒáá·áº áá¯ááºááá¯ážáá¬ážáááºá ááá¯á·áá±á¬áºá async áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááẠá¡ááŸá¬ážáá»á¬ážááᯠáááºáá°ááŒá¯á ááá¯ááºááœááºááẠtry/catch ááᯠáá¯á¶ážááá¯ááºáááºá
async function canRejectOrReturn() {
// wait one second
await new Promise(res => setTimeout(res, 1000));
// Reject with ~50% probability
if (Math.random() > 0.5) {
throw new Error('Sorry, number too big.')
}
return 'perfect number';
}
canRejectOrReturn() ááẠá¡á±á¬ááºááŒááºááẠ("ááŒá®ážááŒáá·áºá á¯á¶áá±á¬ áá¶áá«ááº") ááá¯á·ááá¯áẠá¡ááŸá¬ážá¡ááœááºážáá áºáá¯ááŒá±á¬áá·áº áá»ááŸá¯á¶ážááẠ("áá±á¬ááºážáááºáá«ááẠáá¶áá«áẠá¡áááºážááŒá®ážááœááºážáááº")á
async function foo() {
try {
await canRejectOrReturn();
} catch (e) {
return 'error caught';
}
}
á¡áááºáá±á¬áºááŒáá« á¥ááá¬ááẠcanRejectOrReturn ááᯠexecute áá¯ááºááẠáá»áŸá±á¬áºááá·áºáá¬ážáá±á¬ááŒá±á¬áá·áºá áááºážáááá¯ááºááá¯áẠáá»áá¯á·ááœááºážáá»ááºááẠcatch block á áá¯ááºáá±á¬ááºááŸá¯ááᯠááŒá áºáá±á«áºá á±áááºááŒá áºáááºá ááááºá¡áá±ááŒáá·áºá function foo ááẠáááºááŸááºááá¬ážáá±á¬ (á ááºážáá¯á¶ážááá±á¬ááºááœáẠáááºááá·áºá¡áá¬á០ááŒááºááááá¯ááºááá·áºá¡áá«) ááá¯á·ááá¯áẠá¡ááŸá¬ážáá áºáá¯áááºážááááŒááºážááŒáá·áº á¡áá¯á¶ážáááºáá«áááºá ááááºá¡áá±ááŒáá·áºá try/catch ááẠfunction foo ááá¯ááºááá¯ááºááá¯ááºááœááºáááºááŒá áºáá±á¬ááŒá±á¬áá·áº á€áá¯ááºáá±á¬ááºáá»ááºááẠáá»ááŸá¯á¶ážáááºááá¯ááºáá«á
áá«á áá±á¬ááºááẠá¥ááá¬áá áºáá¯áá«á
async function foo() {
try {
return canRejectOrReturn();
} catch (e) {
return 'error caught';
}
}
á¥ááá¬ááœáẠcanRejectOrReturn ááẠfoo ááŸááŒááºáá¬áááºáá°áá±á¬á¡áá»ááºááá¯á¡á¬áá¯á¶á áá¯ááºááá·áºáááºá á€ááá á¹á ááœáẠFoo ááẠááŒá®ážááŒáá·áºá á¯á¶áá±á¬ áá¶áá«ááºááŒáá·áº áááºá á²ááẠááá¯á·ááá¯áẠá¡ááŸá¬ážáá áºáá¯ááᯠááŒááºáá±ážááẠ("áá±á¬ááºážáááºáá«ááẠáá¶áá«ááºá¡áááºážááŒá®ážáááº")á áááºážáá¯á¶ážááᯠáááºáá±á¬á·á០á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¬ ááá¯ááºáá°ážá
ááŒá¿áá¬ááŸá¬ canRejectOrReturn ááŸáá±ážáá²á·áá±á¬áááááᯠfoo á ááŒááºáá±ážááŒááºážááŒá áºáááºá ááá¯á·ááŒá±á¬áá·áº foo áááŒá±ááŸááºážáá»ááºááẠcanRejectOrReturn á¡ááœááºááŒá±ááŸááºážáá»ááºááŒá áºáá¬áááºá á€ááá á¹á ááœááºá áá¯ááºááẠá á¬ááŒá±á¬ááºážááŸá áºááŒá±á¬ááºážáᬠáá«ááŸááááá·áºáááº-
try {
const promise = canRejectOrReturn();
return promise;
}
á á±á¬áá·áºááá¯ááºážááŒá®áž ááŒááºááœá²áá¯á¶ážáá«á á€á¡áá¬ááẠá¡áááºáááºážá
async function foo() {
try {
return await canRejectOrReturn();
} catch (e) {
return 'error caught';
}
}
á¡áááºáá±á¬áºááŒáá« áá¯ááºááœááºá foo ááẠááŒá®ážááŒáá·áºá á¯á¶áá±á¬ áá¶áá«ááºáá áºáá¯ááŸáá·áº á¡ááŸá¬ážáá áºáᯠáááºážáááá±á¬ ááŸá áºáá¯áá¯á¶ážááŒáá·áº á¡á±á¬ááºááŒááºá áœá¬ ááœááºáá«áááºá á€áá±áá¬ááœáẠááŒááºážááá¯ááŸá¯áá»á¬áž ááŸááááºááá¯ááºáá«á ááá¯á·áá±á¬áº foo ááẠáááºááŸááºááá¬ážááá·áºá¡ááá¯ááºážááá¯ááºáá² canRejectOrReturn ááŒáá·áº ááŒááºááœá¬ážáá«áááºá á á±á¬áá·áºááá¯ááºážáá±áá±á¬ canRejectOrReturn() ááá¯ááºážááᯠáááºááŸá¬ážááŒááºážááŒáá·áº áááºážááᯠáá±áá»á¬á á áºáá±ážááŒáá«á áá¯á·á
try {
const value = await canRejectOrReturn();
return value;
}
// âŠ
á¡ááŒá áºáá»á¬ážáá±á¬ á¡ááŸá¬ážáá»á¬ážááŸáá·áº á¡ááŸá¬ážáá»á¬áž
á¡áá»áá¯á·ááá á¹á áá»á¬ážááœááºá Async/Await ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážááŒáá·áº á¡ááŸá¬ážá¡ááœááºážáá»á¬ážááŒá áºáá±á«áºáá¬ááá¯ááºáááºá
á á±á¬áá·áºáá»áŸá±á¬áºáá±á·áá»á±á¬ááº
á€áááºááŸá¬ áááŒá¬áá ááŒá áºáááºááẠ- áááááááºáá® á á±á¬áá·áºáá»áŸá±á¬áºáá±áá±á¬ á¡áááá áá¬ážáá¯á¶ážááᯠáá±á·ááœá¬ážáááº-
async function foo() {
try {
canRejectOrReturn();
} catch (e) {
return 'caught';
}
}
áááºááœá±á·ááŒááºáááá·áºá¡ááá¯ááºážá áá¯ááºááœáẠá á±á¬áá·áºáá»áŸá±á¬áºááŒááºáž ááá¯á·ááá¯áẠááŒááºáá¬ááŒááºážáááŸááá«á ááá¯á·ááŒá±á¬áá·áº foo ááẠ1 á áá¹ááá·áºááŸá±á¬áá·áºááŸá±ážááŸá¯áááŸááá² áááºááŸááºáá¬ážáá±á¬ááááºááŸááºáá¬ážáá² á¡ááŒá²áááºážááœááºáááºá ááá¯á·áá±á¬áº ááááá±á¬áº ááŒáá·áºá á¯á¶áááá·áºáááºá á¡ááŸá¬ážá¡ááœááºážáá áºáᯠááá¯á·ááá¯áẠááŒááºážáááºáá¶ááá«áá ááá¯á·áá±á¬áẠUnhandledPromiseRejectionWarning ááᯠáá±á«áºáá«áááºá
Callbacks ááŸá Async áá¯ááºáá±á¬ááºáá»ááºáá»á¬áž
Async áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠááŒááºáá±á«áºááŒááºážá¡ááŒá Ạ.map ááá¯á·ááá¯áẠ.filter ááœáẠá¡áá±á¬áºáá±ážá¡áá¯á¶ážááŒá¯áá«áááºá á¥ááá¬áá áºáá¯ááẠGitHub ááœááºááœáá·áºáá¬ážáá±á¬ááá¯ááŸá±á¬ááºááŸá¯á¡áá±á¡ááœááºááá¯ááŒááºáá±ážááá·áº fetchPublicReposCount(á¡áá¯á¶ážááŒá¯áá°á¡áááº) áá¯ááºáá±á¬ááºáá»ááºááŒá áºáááºá áá»áœááºá¯ááºááá¯á·ááá¯á¡ááºáá±á¬ áááºááá áºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áá° áá¯á¶ážáŠážááŸááááºáᯠááá¯ááŒáá«á áá¯á·á á€áááºááŸá¬ á€áá¯ááºáá±á¬ááºá áá¬á¡ááœáẠáá¯ááºááŒá áºáááº-
const url = 'https://api.github.com/users';
// Utility fn to fetch repo counts
const fetchPublicReposCount = async (username) => {
const response = await fetch(`${url}/${username}`);
const json = await response.json();
return json['public_repos'];
}
áá»áœááºá¯ááºááá¯á·ááœáẠArfatSalmaná Octocatá norvig á¡áá±á¬áá·áºáá»á¬áž ááá¯á¡ááºáá«áááºá á€ááá á¹á ááœááºáá»áœááºá¯ááºááá¯á·áááº:
const users = [
'ArfatSalman',
'octocat',
'norvig'
];
const counts = users.map(async username => {
const count = await fetchPublicReposCount(username);
return count;
});
.map callback ááœáẠAwait ááᯠá¡á¬áá¯á¶á áá¯ááºááẠááá¯ááºáááºáá«áááºá á€ááœáẠá¡áá±á¡ááœááºáá»á¬ážááẠááááá»á¬áž á¡á á¯á¶á¡áááºááŒá áºááŒá®áž .map ááẠáááºááŸááºáá¬ážáá±á¬ á¡áá¯á¶ážááŒá¯áá°ááá¯ááºážá¡ááœáẠá¡áááºááá áá¯ááºážáá±á«áºááá¯ááŸá¯áá áºáá¯ááŒá áºáááºá
á¡ááœááºá¡áá»áœá¶ áááááºáááºáž áá¯á¶ážá áœá²áá¬áá«áááºá
áá®áá¯ááºááᯠá¥ááá¬á¡áá±áá²á· áá°ááŒáá·áºáá¡á±á¬ááºá
async function fetchAllCounts(users) {
const counts = [];
for (let i = 0; i < users.length; i++) {
const username = users[i];
const count = await fetchPublicReposCount(username);
counts.push(count);
}
return counts;
}
á€áá±áá¬ááœáẠrepo áá¶áá«ááºááᯠcount variable ááœááºááá·áºáá¬ážááŒá®ážá ááá¯á·áá±á¬áẠá€áá¶áá«ááºááᯠcounts array ááœááºááá·áºáá¬ážáááºá áá¯ááºáááŒá¿áá¬ááŸá¬ áááá¡áá¯á¶ážááŒá¯áá°ááá±áá¬ááᯠáá¬áá¬ááŸáá±á¬ááºááŸááááºá¡áá áá±á¬ááºáááºááœá²á¡áá¯á¶ážááŒá¯áá°á¡á¬ážáá¯á¶áž á¡ááá·áºá¡áá±á¡áá¬ážááœáẠááŸááá±áááºááŒá áºáááºá ááá¯á·ááŒá±á¬áá·áºá áá áºááŒáááºáá»áŸáẠá¡áá¯á¶ážááŒá¯áá°áá áºáŠážáᬠáá¯ááºáá±á¬ááºáááºá
á¥ááá¬á¡á¬ážááŒáá·áºá áá¯á¶ážá áœá²áá°áá áºáŠážááᯠáá¯ááºáá±á¬ááºááẠ300 ms ááá·áºááŒá¬áá«áá á¡áá¯á¶ážááŒá¯áá°á¡á¬ážáá¯á¶ážá¡ááœáẠáááºážááẠáá áºá áá¹ááá·áºááŒá áºáá±ááŒá®ááŒá áºááŒá®ážá á¡áá»áááºááẠá¡áá¯á¶ážááŒá¯áá°á¡áá±á¡ááœááºáá±á«áºááœáẠáá°áááºáá«áááºá ááá¯á·áá±á¬áº repo á¡áá±á¡ááœááºááá¯ááá°ááŒááºážááẠáá áºáá¯ááŸáá·áºáá áºáá¯á¡áá±á«áºááá°áááºáá±á¬ááŒá±á¬áá·áº áá¯ááºáááºážá ááºáá»á¬ážááᯠááŒáá¯ááºáá°áá¯ááºáá±á¬ááºááá¯ááºáááºá áááºážááẠ.map ááŸáá·áº Promise.all ááŒáá·áº áá¯ááºáá±á¬ááºááẠááá¯á¡ááºáááº-
async function fetchAllCounts(users) {
const promises = users.map(async username => {
const count = await fetchPublicReposCount(username);
return count;
});
return Promise.all(promises);
}
Promise.all ááẠááá·áºááœááºážááŸá¯á¡ááŒá Ạááááá»á¬ážá áœá¬ááᯠáááºáá¶áááŸáááŒá®áž ááááá áºáᯠááŒááºáá±ážáááºá á¡áááºážá¡áá»ááºážááŸá ááááá»á¬ážá¡á¬ážáá¯á¶áž ááŒá®ážááŒá±á¬ááºááŒá®ážáá±á¬áẠááá¯á·ááá¯áẠáááá¡ááŒááẠáááºáá»áá¶áááŒá®ážáá±á¬áẠááŒá®ážááŒá±á¬ááºáááºá áááºážááá¯á·á¡á¬ážáá¯á¶ážááẠáá áºáá»áááºáááºážááœáẠáá áááºááá¯ááºáá±á¬ááŒá±á¬áá·áº ááŒá áºáá¬ááá¯ááºááẠ- áá áºááŒáá¯ááºáááºáááºáž á áááºááŒááºážááᯠáá±áá»á¬á á±áááºá¡ááœáẠáááºááẠp-map ááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá
áá±á¬ááºáá»ááº
Async áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááẠááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯á¡ááœáẠááá¯áá¡áá±ážááŒá®ážáá¬áááºá áá±á¬ááºážááŒá®á async áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠááá¯ááºáá»á±á¬áá®ááœá±ááŒá
áºá¡á±á¬áẠá¡áá¯á¶ážááŒá¯áááºá¡ááœáẠáááºááẠá¡áá¯á¶ážááŒá¯ááá·áºáááºá
Skillbox á០á¡ááŒá¶ááŒá¯áá¬ážáááº-
- áááºááœá±á·áááºáááºáž
"ááá¯ááá¯ááºáž Developer PRO" .- á¡áá¯á¶ážáá» á¡áœááºááá¯ááºážáááºáááºáž
"Python Data Analyst" .- ááŸá áºááŸá áºá á¬áááºááœá±á·áááºáááºáž
"áá»áœááºáá±á¬áºá PRO Web Developer áá áºáá±á¬ááºáá«" .
source: www.habr.com