แกแขแแขแแแก แแแขแแ แ แแแแแฎแแแแแก Async/Wait-แแก แแแแแแแแแแก JavaScript-แจแ. แกแแแ แแ แฏแแแจแ, Async/Await แแ แแก แแแกแแฎแแ แฎแแแแแ แแแ แแกแแแฅแ แแแฃแแ แแแแแก แแแกแแฌแแ แแ. แกแแแแ แแก แคแฃแแฅแชแแ แแแแแฉแแแแแแแ, แแกแแแ แแแแ แแฌแแ แแแแแ แแแ แแแแก แแ แแแแแ แแแแแแก แแแแแงแแแแแแ. แแ แแแแแแแฃแ แ แกแขแแขแแแก แแแขแแ แ แแแแแแก Async/Await-แแก แฃแแแ แแขแแกแแแแแก แกแฎแแแแแกแฎแแ แแแแแแแแแแแก แแแแแแแแแแแแ.
แจแแแแฎแกแแแแแ: "Habr"-แแก แงแแแแ แแแแแฎแแแแแกแแแแก - แคแแกแแแแแแแ 10 แ แฃแแแแแแ Skillbox-แแก แแแแแกแแแแ แแฃแ แกแแ แฉแแ แแชแฎแแแกแแก "Habr" แกแแ แแแแแแ แแแแแก แแแแแงแแแแแแ.
Skillbox แแแ แฉแแแ: แกแแแแแแแแแแแแแแ แแแแแแ แแฃแ แกแ
"แฏแแแแก แแแแแแแแแ แ" .
แแแแแแ แแแ
แแแแแซแแฎแแแ แแ แแก แคแฃแแฅแชแแ, แ แแแแแก แแแ แ แแแแแแแแแแฃแแแ แแแแฃแกแแแฆแแ แแแ แแแแแ. แแแ แ, แแแแแซแแฎแแแแแ แแแแแแงแแแแแแแ แแแแแก แแ แแแแแแแแจแ, แกแแแแช แจแแแแแแก แแแฃแงแแแแแแแแ แแแฆแแแ แแแ แแแฎแแ แฎแแ.
แแฅ แแแชแแแฃแแแ แคแแแแแก แแกแแแฅแ แแแฃแแแ แฌแแแแแฎแแแก แแแแแแแแ 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 แแแแแแงแแแแแ แงแแแแ แจแแชแแแแแก แแแกแแแแแ แแแแแ.
- แ แแแแแแแแ แแแแแ แแแแแ แแฃแจแแแแ แแ แแ แแแ แงแฃแแแก แคแแ แแแแแจแ แงแแแแแแแแก แแ แแ แแก แแแกแแฎแแ แฎแแแแแ; แแแแแแ แ แจแแแแฎแแแแแจแ, แแกแแแ แแ แแฃแแแแแ แแแแก.
แแฅ แแ แแก แแ แแแแแแ, แ แแแแแแช แแฉแแแแแแก แแแแ แแฃแแฅแขแแก แแแแจแแแแแแแแก.
แแแแฃแจแแแ, แแแแฅแแก for loop, แ แแแแแแช แแแญแแแแก แ แแชแฎแแแแแก แแแแแแแแแแ แแแแก 0-แแแ 10-แแแ แจแแแแฎแแแแแแ แแแขแแ แแแแแแแ (0โn แฌแแแ). แแแแแ แแแแแแก แแแแแงแแแแแแ, แแฅแแแ แฃแแแ แจแแชแแแแแ แแก แชแแแแ แแกแ, แ แแ แ แแชแฎแแแแ แแแแแแญแแแก แแแแแแแแแแ แแแแ 0-แแแ 10-แแแ. แแกแ แ แแ, แแฃ แแฃแแแก แแแแแญแแแแก แกแญแแ แแแแ 6 แฌแแแ แแ แแ แแแก แแแแแญแแแแก 2 แฌแแแ, แฏแแ แฃแแแ แแแแแแญแแแก แแฃแแ, แจแแแแแ แแ. แแแแฌแงแแแ แแแแแ แแ แแแก แแแกแแแแญแแแ.
แแ แ แ แแฅแแ แฃแแแ, แแ แแ แแแแแแแก แแแกแแแแแ แแแแแ แฉแแแ แแ แแแงแแแแแ Async/Wait แแ .sort-แก. แแแแแกแแแแแก แแแแแแแแ แแ แแก แแแแแก.
แแกแแแฅแ แแแฃแแ แคแฃแแฅแชแแแแ
Async แคแฃแแฅแชแแแแแก แแแแแขแแแ ES2017-แจแ (ES8) แแแแแแ แขแแแ แแแแแ แแแแแแแ แแฃแจแแแแแก แแแแชแแแ. แแ แแฆแแแแจแแแ, แ แแ แแกแแแฅแ แแแฃแแ แคแฃแแฅแชแแแแ แแฃแจแแแแก แแแแแ แแแแแแก "แแแแแแ". แแก แคแฃแแฅแชแแแแ แแ แฌแแ แแแแแแแแก แแแแกแแแ แแแแ แแแแกแฎแแแแแแฃแ แชแแแแแแก. Async แคแฃแแฅแชแแแแ แแแแแแแฃแแแ, แ แแแแ แช แแแแแก แแแขแแ แแแขแแแ, แ แแแแแแช แแงแแแแแก แแแแแ แแแแแก.
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! แฃแแแ แแแแฎแกแแแแแก, แ แแ แแแแกแแก แแแแกแขแ แฃแฅแขแแ แแแ แแ แแแแฆแแแแแ/แแแแฌแแ แแแ แแ แจแแแซแแแแ แแงแแก แแกแแแฅแ แแแฃแแ.
แกแแแแแขแแแ แแ แจแแกแ แฃแแแแแก แฌแแกแแแ
Async แคแฃแแฅแชแแแแ แซแแ แแแแแแ แแกแแแแกแแ แกแขแแแแแ แขแฃแแ JS แคแฃแแฅแชแแแแแก, แแแแ แแ แแ แแก แแแแแแแแแแกแแแ.
แแแ แแแแ, แแกแแแฅแ แแแฃแแ แคแฃแแฅแชแแแแ แงแแแแแแแแก แแแ แฃแแแแก แแแแแ แแแแแก:
async function fn() {
return 'hello';
}
fn().then(console.log)
// hello
แแแ แซแแ, fn แแแ แฃแแแแก แกแขแ แแฅแแแก hello. แแแ แแแ, แ แแแแแ แแก แแกแแแฅแ แแแฃแแ แคแฃแแฅแชแแแ, แกแแแแแแแแ แแแแจแแแแแแแ แจแแคแฃแแฃแแแ แแแแแ แแแแจแ แแแแกแขแ แฃแฅแขแแ แแก แแแแแงแแแแแแ.
แแฅ แแ แแก แแแขแแ แแแขแแฃแแ แแแแแแแ 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 แคแฃแแฅแชแแแแ แงแแแแแแแแก แแซแแแแแ แแแแแ แแแแก, แแแฃแฎแแแแแแ แแแแกแ, แแฃ แ แ แแแแ แฃแแแแแ.
แแกแแแฅแ แแแฃแแ แคแฃแแฅแชแแแแ แฉแแ แแแแ แงแแแแแ แแแแแแแก แแ แแก.
แแแแแแแแ แแแแแแแแก แแฎแแแแก แแแแแแแแฅแแแแแแแ. แแกแ แ แแ, แแฃ แแแแแแฅแแ แแ แแก แแแแแ แแแ, แแกแแแชแแ แแแแก แคแฃแแฅแชแแ แจแแฉแแ แแแฃแแแ แแแแแ แแแแก แจแแกแ แฃแแแแแแแ. แแฃ แแแแแแฅแแ แแ แแ แแก แแแแแ แแแ, แแก แแแ แแแแฅแแแแแ แแแแแ แแแแ 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 = แแแแแแแแ Promise.resolve(9);.
- Await-แแก แแแแแงแแแแแแก แจแแแแแ, แคแฃแแฅแชแแแก แจแแกแ แฃแแแแ แจแแฉแแ แแแฃแแแ แแแแแ, แกแแแแ a แแ แแแแฆแแแก แแแแแก แแแแจแแแแแแแแก (แแแแแแแแ แ แกแแขแฃแแชแแแจแ แแ แแก 9).
- delayAndGetRandom(1000) แแฉแแ แแแก fn แคแฃแแฅแชแแแก แจแแกแ แฃแแแแแก, แกแแแแ แแก แแ แแแกแ แฃแแแแแ (1 แฌแแแแก แจแแแแแ). แแก แแคแแฅแขแฃแ แแ แแฉแแ แแแก fn แคแฃแแฅแชแแแก 1 แฌแแแแ.
- delayAndGetRandom(1000) via solution แแแ แฃแแแแก แจแแแแฎแแแแแ แแแแจแแแแแแแแก, แ แแแแแแช แจแแแแแ แแแแญแแแ b แชแแแแแก.
- แแกแ, 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 function printNumbersUsingAsync() {
for (let i = 0; i < 10; i++) {
await wait(i, Math.random() * 1000);
console.log(i);
}
}
แจแแชแแแแแก แแแแฃแจแแแแแ
แแแฃแแฃแจแแแแแแแ แจแแชแแแแแแ แฃแแ แงแแคแแ แแแแแ แแแแจแแ แแแฎแแแฃแแ. แแฃแแชแ, แแกแแแฅแ แแแฃแ แคแฃแแฅแชแแแแก แจแแฃแซแแแแ แแแแแแงแแแแ 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-แแก แจแแกแ แฃแแแแแก, แแแกแแแ แฌแแ แฃแแแขแแแแแแ แแแแแแฌแแแแก catch แแแแแแก แจแแกแ แฃแแแแแก. แจแแแแแแ, แคแฃแแฅแชแแ foo แแแกแ แฃแแแแแ แแ แแแแฃแกแแแฆแแ แแแ (แ แแแแกแแช แแ แแคแแ แ แแแแ แฃแแแ try แแแแแจแ) แแ แแแคแแฅแกแแ แแแฃแแ แจแแชแแแแแ. แจแแแแแแ, แแก แคแฃแแฅแชแแ แแ แฉแแแแ แแแแ, แ แแแแแ try/catch แแแแแ แแแฃแแแแแแแแแ แคแฃแแฅแชแแแก 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-แแ แแ แแ แ แแแแฃแกแแแฆแแ แแแแ. แแแแแ แแแแ แฌแแฃแแแแ แแแแจแ แแแแ แฃแแแแแก await canRejectOrReturn() แฎแแแแก แฌแแจแแแ:
try {
const value = await canRejectOrReturn();
return value;
}
// โฆ
แกแแแ แแ แจแแชแแแแแแ แแ แฎแแ แแแแแแ
แแแแแแ แ แจแแแแฎแแแแแจแ, Async/Await-แแก แแแแแงแแแแแแ แจแแแซแแแแ แแแแแแฌแแแแก แจแแชแแแแแแ.
แแแแแฌแงแแแฃแแ แแแแแแแ
แแก แฎแแแแ แกแแแแแแ แฎแจแแ แแ - แแแแแแแก แกแแแแแแซแ แกแแขแงแแ แแแแแฌแงแแแฃแแแ แแแแแ แแแแแแ:
async function foo() {
try {
canRejectOrReturn();
} catch (e) {
return 'caught';
}
}
แ แแแแ แช แฎแแแแแ, แแแแจแ แแ แแ แแก แแแแแแ แแ แแแแ แฃแแแแ. แแแแขแแ foo แงแแแแแแแแก แแแแแแแก แแแแฃแกแแแฆแแ แแแแ 1 แฌแแแแก แแแแแแแแแแแก แแแ แแจแ. แแแแ แแ แแแแแ แแแ แจแแกแ แฃแแแแแ. แแฃ แจแแชแแแแ แแ แฃแแ แงแแคแ, แแแจแแ แแแแแแซแแฎแแแ UnhandledPromiseRejectionWarning.
แแกแแแฅแ แแแฃแแ แคแฃแแฅแชแแแแ แแแแแซแแฎแแแแแจแ
Async แคแฃแแฅแชแแแแ แกแแแแแแ แฎแจแแ แแ แแแแแแงแแแแแ .map-แจแ แแ .filter-แจแ, แ แแแแ แช แแแแแฎแแแฃแ แแแ. แแแแก แแแแแแแแแ fetchPublicReposCount(username) แคแฃแแฅแชแแ, แ แแแแแแช แแแ แฃแแแแก 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 แแ แแก แแแแแแแฃแ แ แแแแแซแแฎแแแ แแแแแแฃแแ แแแแแแแแฃแแ แแแแฎแแแ แแแแแกแแแแก.
แแแแแแแแแก แแแแแแขแแ แแแแแแแแแแ แฃแแ แแแแแงแแแแแ
แแแแฆแแ แแก แแแแ แแแแแแแแแ:
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;
}
แแฅ แ แแแ แแแแแ แ แแแแแแกแแแฃแแแ count แชแแแแแจแ, แจแแแแแ แแก แ แแชแฎแแ แแแแขแแแ counts แแแกแแแก. แแแแแก แแ แแแแแแ แแก แแ แแก, แ แแ แกแแแแ แแแ แแแแ แแแแฎแแแ แแแแแก แแแแแชแแแแแ แแ แแแแ แกแแ แแแ แแแแ, แงแแแแ แแแแแแแแ แแแแฎแแแ แแแแแ แแฅแแแแ แแแแแแแก แ แแแแแจแ. แแแ แแแแ, แแฎแแแแ แแ แแ แแแแฎแแแ แแแแแ แแฃแจแแแแแแ แแ แแแ แแฃแแแ.
แแฃ, แแแแแแแแแ, แแ แแ แแแแฎแแแ แแแแแก แแแแฃแจแแแแแแก แกแญแแ แแแแ แแแแฎแแแแแแ 300 ms, แแแจแแ แงแแแแ แแแแฎแแแ แแแแแกแแแแก แแก แฃแแแ แแแแ แแ; แแแฎแแ แฏแฃแแ แแ แ แฎแแแแแ แแแแ แแแแแแแแแแฃแแแ แแแแฎแแแ แแแแแแ แ แแแแแแแแแแ. แแแแ แแ แแแแแแแแ แ แแแแก แ แแแแแแแแแก แแแฆแแแ แแ แแแแแแแแ แแ แแ แแก แแแแแแแแแแฃแแ, แแ แแชแแกแแแแก แแแ แแแแแแแแแ แจแแกแแซแแแแแแแ. แแก แแแแแฎแแแก แแฃแจแแแแแก .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.
แแแกแแแแ
แแกแแแฅแ แแแฃแแ แคแฃแแฅแชแแแแ แกแฃแ แฃแคแ แ แแแแจแแแแแแแแแ แฎแแแแ แแแแแแแแ แแแแกแแแแก. แแกแ, แแกแแแฅแ แแแฃแแ แคแฃแแฅแชแแแแแก แแแแแขแฃแ แ แแแแแงแแแแแแกแแแแก, แแฅแแแ แฃแแแ แแแแแแงแแแแ
Skillbox แแแ แฉแแแ:
- แแ แแฅแขแแแฃแแ แแฃแ แกแ
"Mobile Developer PRO" .- แแแแแ แแ แแแแแแ แแฃแ แกแก
"แแแแแชแแแแแแก แแแแแแขแแแแกแ แแแแแแจแ" .- แแ แฌแแแแแ แแ แแฅแขแแแฃแแ แแฃแ แกแ
"แแ แแแ แแแ แแแแแแแแแ แ PRO" .
แฌแงแแ แ: www.habr.com