α’ααααα·ααααα’ααααααα·αα·αααααΎαα§ααΆα ααααα Async/Await αα
αααα»α JavaScript α ααα»ααα Async/Await ααΊααΆαααααααΆαααΆααααα½ααααα»αααΆααααααααΌαα’ααααΆαα αα»αααααααααααα·ααααααααα
α‘αΎα ααΌαααααααααααΌαααΆαααααααααααααΎααΆαα α
αααα‘αααααα·α αα·αααΆααααααΆα α’ααααα·ααααα’αααααααΎααααα αΆαααΈαα»ααααααααα·αααα Async/Await αααααΆααα·ααΆαα§ααΆα αααααααααα
ααΎαααααΉαα αααααΆααα’αααα’αΆαααΆααα’αααα "Habr" - ααΆααααα α»αααααα 10 rubles αα αααα α»αααααααααα»ααααααα·ααααΆ Skillbox ααΆαα½ααααααααΎαααααΌαααααααααααΆα "Habr" α
Skillbox ααααΆαα αααααα·ααααΆααΆαα’ααΈαααΊαα·α
"α’αααα’αα·αααααα Java" .
α α αα αα·α
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α αα½αααα’αα»ααααΆαα±ααα’ααααααα½ααααα»ααααα ααααΆαα α αααα‘αααααα·ααααααΆααα .then α
αα·αααααΆααα·αααααΆαααααΆααααααΆααΊααΆαα½αααααααΎα±ααααΌαα’αΆα α’αΆαααΆαααΆααααααα’ααΈααααΌααα ααΆαααΆααΆαααΈααααααα ααααΆαα ααααααΆαααΆααααα ααΆααααααΆααααΆααααα αΆαααααα½ααααααααα
- α’αααααααΌαααααααα αααΎαα
- αααα½αα±αα try/catch, .catch ααααΌαααΆαααααΎααΎααααΈαααααααΆαααΆααααα α»αα
- ααΆαααααΎααΆαααΆαα½αααΆααααααΆααΆα αααΎααα αααα»αααααα·ααα»ααα½αααΊαα·ααααααααΆααααα½αααααα αααα»αααααΈααααααΆααααΎα±ααααΌααααα»αααααΆαα
αααααΊααΆαααα αΆαααααΉααααα αΆαααΈα’ααααααααα ααα»α α α»ααααααα
α§αααΆααΆααΎαααΆααααααΆααααααα·ααα»ααααααααα»αααααααΆαααααααααΈ 0 αα 10 αα α ααααααααα ααααα (0βn αα·ααΆααΈ)α αααααααΎααΆααααααΆ α’αααααααΌαααααΆααααααΌαααααα·ααα»ααααααΎααααΈα±αααααααααΌαααΆαααααα»αααααΆαααααΆαααααααααΈ 0 αα 10α ααΌα αααα ααααα·αααΎααΆααααΌαααΆαααα 6 αα·ααΆααΈααΎααααΈααααα»ααααααααΌααα αα·α 2 αα·ααΆααΈααΎααααΈααααα»ααααααααΌααααα½αααααααΌαααΆαααααα»αααααΆαα»ααα·α α αΎααααααΆαααα ααΆαααΆααααααααααααααΆααααΆαααααα»αααααΉαα αΆααααααΎαα
α αΎαααΆααΆααα·αααΆαα ααΎααα·αααααΎ Async/Await α¬ .sort ααΎααααΈαααααααΆααααα αΆαααααα α§ααΆα ααααααααααααΆαααΊαα α α»ααααα ααα
αα»αααΆα Async
ααΆααααααααα»αααΆα async αα αααα»α ES2017 (ES8) ααΆαααααΎα±ααααΆαααΆαααΆααααα½αααΆαα½αααΉαααΆααααααΆα αααα»αααααααααΆααααΆαα»αααΆα async ααααΎαααΆα "αα ααΎααααΌα" ααααΆααααααΆα αα»αααΆαααΆααααααα·αααααΆαα±ααααααααα·ααααααααααΆαααααααααα»αααΆαααα αα»αααΆα Async ααααΌαααΆαααααα»ααα»αααΆαααααΎααα½ααααααΆααααΌααααααααΎααΆααααααΆα
Async/Await ααααΎα±ααααΆα’αΆα αααα αααΆαααΆαααΆαα½αααΌαα’ααααΆααααα»ααα ααΆαααααααααΆααααααα½αα
ααΌα αααα ααΆαααΉαααΈααΆααααααΆααααΎα±ααααΆααΆααααααΆααααα½ααααα»αααΆααααα’αααΈαααααΆααααα Async/Await α
ααΆααααααααααα
ααΆααααααΆααΆααΆαααΆααααααααΉαααΈαα async αα·α wait α ααΆαααααΈαα½ααααααα»αααΆααα ααΆα’ααααΆαα αα»αααΆαααααααα’αα»ααααΆαα±ααααααΎααΆααααα αΆαα αααα»αααααΈαααααααα ααΆαααααΎαα»αααΆααααααΉααααααΎαααα α»αα
// With function declaration
async function myFn() {
// await ...
}
// With arrow function
const myFn = async () => {
// await ...
}
function myFn() {
// await fn(); (Syntax Error since no async)
}
Async ααααΌαβααΆαβαααα αΌαβαα βααΎαβααααΌαβααβααΆαβαααααΆαβα’αα»αααα α αΎαβαααα»αβααααΈβααβαα»αααΆαβαααα½α αααΆαβαααααΆ β=β αα·αβααααααα αα
αα»αααΆαααΆαααααα’αΆα ααααΌαααΆαααΆαααααα»αααααα»ααΆαα·ααΈααΆααααα α¬ααααΎαααα»αααΆααααααΆαααααΆααα
// 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 αα·αα’αΆα ααααΎααααΆαααααααΆαααα
αααα½ααααααααΆαααΆααα αα·αααΆαα’αα»αααα
αα»αααΆα Async ααΆαααΌαααααΆαααααααααααΆαα ααΉααα»αααΆα JS αααααααΆα ααα»ααααααΆαααααΈααΎααααα
ααΌα αααα αα»αααΆα async ααααααααααααααα·αααΌαααΆααααααΆα
async function fn() {
return 'hello';
}
fn().then(console.log)
// hello
ααΆαα·ααα fn αααα‘ααααααα’αααα hello α ααΆααΆααααααΎαααΆαα αααααΆααααααΆαα»αααΆαα’ααααΆα αααααααααα’ααααααααΌαααΆααα»ααααααΆααααααΆαααααααΎ constructor α
αααααΆααΆααα ααΆαααα½ααααααααΆα 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
ααα»ααααααΎααΆαα’αααΈααΎαα‘αΎαααααα·αααΎααΆαααα α»ααα αααα»ααα»αααΆαα’ααααΆα?
async function foo() {
throw Error('bar');
}
foo().catch(console.log);
ααααα·αααΎααΆαα·αααααΎαααΆααα foo() ααΉααααααααααα·αααΌαααΆααααααΆααΆαα½αααΉαααΆαααα·αααα αααα»αααααΆαααΆαααα Promise.reject αααααΆαααα α»αααΉαααααΌαααΆααααααΌααααα·ααααα½αα±αα Promise.resolve α
αα»αααΆα Async ααααααααααααΆααααααΆ ααααα·ααα·αααΈα’αααΈαααααααΌααααααααααα·αα
αα»αααΆαα’ααααΆαααα’αΆαααΆααααΆααααα αΆαα
ααΆααααα αΆααααααΆαααααααΆααααα ααααα·α ααΌα αααα ααααα·αααΎααΆααααα ααααα·ααΊααΆααΆααααααΆ αα»αααΆα 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; αα αααα»α const a = αααα αΆα Promise.resolve(9);
- αααααΆααααΈααααΎ Await ααΆαααααα·ααααα·αα»αααΆαααααΌαααΆαααα’αΆααα αΌαααααααααααααααΆ (αααα»αααααΆαααΆααα αα α»ααααααααΆααΊ 9)α
- delayAndGetRandom(1000) ααα’αΆαααΆαααααα·ααααα·αα»αααΆα fn αα αΌααααααΆαααα ααααααααα½αααΆ (αααααΆααααΈ 1 αα·ααΆααΈ)α ααΆαααααααα»αααΆα fn αααΆαααΆαααααα·αααααΆααααααα 1 αα·ααΆααΈα
- delayAndGetRandom(1000) ααΆααααααΆααααααααΆα αααα‘αααααααα ααααα ααααααααΆααααααααΌαααΆαααααααα α’ααα αα
- ααΆααΆααααααΎαααΆαα ααααΈαααααΆαα’ααα c ααΊααααααααΉαααααΈαααααΆαα’ααα a α αααααΆααααΈααα α’αααΈααααααααΆαααααα½ααα·ααΆααΈ ααα»ααααα₯α‘αΌαααα delayAndGetRandom(1000) αααα‘ααααααΆαα’αααΈααααααααααΆαα·αααααΌαααΆαααΆαααΆαα
- ααΆαααααααααααααααΌαααΆαααααΆαααααααΎααΌααααα a + b * c α ααααααααααΌαααΆααα»ααααααΆααααααΆαααααααΎ Promise.resolve α αΎααααα‘ααααααα»αααΆαα
ααΆαααα’αΆαααΆαααααα’αΆα
ααΆααΆαααΉαααΎαααααααΆαααΈαααααΎααα
αααα»α ES6 ααα»ααααααΆαα’αααΈαααααΆαα
ααααααΆα
ααΆααααααααΆααααα αΆ
αααα αΎαα₯α‘αΌααααααΌααααα‘ααααΎααααααααααΆαα αααααααα αΆαααααΆααααααΆααααΆαααΎα
αα»αααΆα finishMyTask ααααΎ Await ααΎααααΈαααα αΆαααααααααααααα·ααααα·ααΆαααΌα ααΆ queryDatabase, sendEmail, logTaskInFile αα·ααααααααααα ααααα·αααΎα’ααααααααααααααααααααΆααααααΆαα½αααΆααααααΆαααααααΌαααΆαααααΎ ααΆαααααααααααΆααΉαααααΆααα ααΆααΆαααααααα αααααΆαααΆαααΆααααα αααα Async/Await αα½αααααα½ααααααΆααααα»αααααΆαααααΆαααααααααααααΆααα’ααα αααα»αααααΈααα αα·αααΆαααΆαα α αααα‘αααααα·α αα·ααααααααααΆαααα½αα ααα½αααααΌα ααΆ .then/.catch ααα
αααααΊααΆαααααααααΆαααΆαα½αααΉαααααααααααα ααΆααααααΎαααΈαα
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 ααΎααααΈααααα·ααααα· ααΆααααΆαααααααααΆααααΆααααΉαααΆαα±ααααΆαααΆαααααα·ααααα·αααααα»αα αΆααα ααΆαααααα αα»αααΆα foo ααΉααααα ααααααα·αααΆαααααα (αα ααααααααααΆαα’αααΈααααΌαααΆααααα‘αααααα·ααα αααα»ααααα»αααΆααααα) α¬ααΆαα½αααΉαααα α»αα αΆααααΆαα ααΆαααααα αα»αααΆααααααΉααα·ααααΆααααα ααΈαααααααΆαααααΆααΆα/α αΆααααΉαααααααααααα»αααΆααααααααααα½αα―αα
αααααΆα§ααΆα ααααα½ααααα
async function foo() {
try {
return canRejectOrReturn();
} catch (e) {
return 'error caught';
}
}
ααΆαα½αα’ααααα α·ααααα»αααΆααα ααααααΆααα·ααααααΆαα αααα»αα§ααΆα ααα canRejectOrReturn ααααΌαααΆαααααααααΈ foo α Foo αα βαααα»αβααααΈβαααβα’αΆα βαααα ααβαααβαααβααα’βα₯αβααα αα α¬βαααα‘ααβααα α»α (βααΌαβααα αααβααβαααβ)α αααα»αα αΆααααΉααα·αααααΌαααΆαα’αα»ααααααα
αααα αΆααΊααΆ foo αααα‘ααααΆααααααΆαααααΆαα’αα»αααααΈ canRejectOrReturn α ααΌα αααααααααααααΆααα 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 ααΉαααααΌαααΆαα α α
αα»αααΆα Async αααα»α Callbacks
αα»αααΆα Async ααααΌαααΆαααααααΎααΆααΉαααΆαααα αααα»α .map α¬ .filter ααΆααΆαα α αααα‘αααααα·αα α§ααΆα ααααα½αααΊαα»αααΆα fetchPublicReposCount(αααααα’αααααααΎααααΆαα) ααααααα‘ααα ααα½αααααΆαααααααΎααα ααΎ GitHub α α§αααΆααΆααΆαα’αααααααΎααααΆααααΈααΆαααααααααααααααααΎαααααΌαααΆαα αααααΆααΌααααααΆαααα·α αα ααΆααααα
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;
});
ααΆαα½αα’ααααα α·ααααα»αααΆααα αααα Await αα αααα»α .map callbackα ααΆαααΆαααα ααΈαααααΊααΆα’αΆααααααΆααααααΆ α αΎα .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 ααααΌαααΆαααΆαααααα»αα’αααααΆαα αααααΆααααααααααααααΌαααΆααααααααα α’αΆααααΆααα αααα αΆααΆαα½αααΌαααΊααΆαα αΌαααααα·ααααααααααα’αααααααΎααααΌααααααααΈαααΆαααΈααα α’αααααααΎααααΆααααΆαααααααααΆααααΆααα’ααααΉααααα·ααααα»ααααααααα αΆαα ααΌα ααααααΆαααα’αααααααΎααααΆααααααΆααααα»ααααααααααααΌαααΆαααααΎαααΆααααα»αααααααα½αα
α§ααΆα ααα ααααα·αααΎααΆααααΌαα αααΆαααααααα αα 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 ααααΆαα
- αααααα·ααααΆααΆααααααα
"α’αααα’αα·ααααααα ααα PRO" .- ααΆαα’αα»αααααααααα·ααααΆααΆαα’ααΈαααΊαα·α
"α’ααααα·ααΆααα·αααααααα αααα»α Python" .- αααααα·ααααΆααΆαααααααααααααααΈαααααΆα
"αααα»αααΆα’ααααααααΎαααα ααααα PRO" .
ααααα: www.habr.com