ืืขืจ ืืืืจ ืคืื ืืขื ืึทืจืืืงื ืืืืึทืืึทื ื ืืืืฉืคืืื ืคืื Async / Await ืืื ืืืฉืึทืืืึทืกืงืจืืคึผื. ืงืืืืขืืืืง, Async / Await ืืื ืึท ืืึทืงืืืขื ืืืขื ืฆื ืฉืจืืึทืื ืืืกืื ืืงืจืึทื ืึทืก ืงืึธื. ืืืืืขืจ ืืขื ืฉืืจืื ืืจืืืก, ืึทืืึท ืงืึธื ืืื ืืขืืืขื ืืขืฉืจืืื ืืื ืงืึทืืืืึทืงืงืก ืืื ืืืืืืช. ืืขืจ ืืืืจ ืคืื ืืขืจ ืึธืจืืืื ืขื ืึทืจืืืงื ืจืืืืืื ืื ืึทืืืืึทื ืืืืืฉืื ืคืื Async / Await ืืืจื ืึทื ืึทืืืืืื ื ืคืึทืจืฉืืื ืืืืฉืคืืื.
ืืืจ ืืขืจืืึธื ืขื ืืืจ: ืคึฟืึทืจ ืึทืืข ืืืืขื ืขืจ ืคืื "ืืืจ" - ืึท ืึทืจืึธืคึผืจืขืืขื ืขื ืคืื 10 ืจืืื ืืืขื ืืืจ ืคืึทืจืฉืจืืึทืื ืืื ืงืืื ืกืงืืืืึธืงืก ืงืืจืก ื ืืฆื ืื ืคึผืขืจืืึธืืฉืึทื ืึทื ืงืึธื "ืืืจ".
Skillbox ืจืขืงืึทืืขื ืื: ืืืืืื ืืงืจืืื ืึธื ืืืื ืงืืจืก
"ืืืฉืึทืืืึท ืืขืืืขืืึธืคึผืขืจ" .
ืงืึทืืืืึทืงืง
Callback ืืื ืึท ืคึฟืื ืงืฆืืข ืืืขืืขื ืก ืจืืคื ืืื ืืืืืื ืื ืืขืคืึทื ืึทืืื. ืืื ืึทืืขืจ, ืงืึทืืืืึทืงืงืก ืืขื ืขื ืืขื ืืฆื ืืื ืื ืืขืืืื ืคืื ืงืึธื ืืื ืืขืจ ืจืขืืืืืึทื ืงืขื ื ืืฉื ืืืื ืืืงืืืขื ืืื.
ืืึธ ืืื ืึท ืืืืฉืคึผืื ืคืื ืืืกืื ืืงืจืึทื ืึทืกืื ืืืืขื ืขื ืึท ืืขืงืข ืืื Node.js:
fs.readFile(__filename, 'utf-8', (err, data) => {
if (err) {
throw err;
}
console.log(data);
});
ืคึผืจืึธืืืขืืก ืืืืคืฉืืืื ืืืขื ืืืจ ืืึทืจืคึฟื ืฆื ืืืจืืคืืจื ืขืืืขืืข ืืืกืื ืืงืจืึทื ืึทืก ืึทืคึผืขืจืืืฉืึทื ื ืืื ืึทืืึธื. ืืื ืก ืืืึทืืืฉืึทื ืืขื ืกืฆืขื ืึทืจ: ืึท ืืงืฉื ืืื ืืขืืืื ืฆื ืื ืึทืจืคืึทื ืืึทื ืืฆืขืจ ืืึทืืึทืืืืก, ืืืจ ืืึทืจืคึฟื ืฆื ืืืืขื ืขื ืืืึทื profile_img_url ืคืขืื ืืื ืืจืืคืงืืคืืข ืึท ืืืื ืคืื ืื someserver.com ืกืขืจืืืขืจ.
ื ืึธื ืืึทืื ืืึธืืืื ื, ืืืจ ืืขืจ ืื ืืืื ืฆื ืื ืื ืืขืจ ืคึฟืึธืจืืึทื, ืืืฉื ืคึฟืื PNG ืฆื JPEG. ืืืื ืื ืงืึทื ืืืขืจืืฉืึทื ืืื ืืขืืืขื ืืขืจืึธืื, ืึท ืืจืืื ืืื ืืขืฉืืงื ืฆื ืืขืจ ืืึทื ืืฆืขืจ ืก E- ืืจืืื. ืืขืจื ืึธื, ืืื ืคึฟืึธืจืืึทืฆืืข ืืืขืื ืืขืจ ืืขืฉืขืขื ืืฉ ืืื ืืจืืื ืืื ืื transformations.log ืืขืงืข, ืืืึธืก ืื ืืืงืืืฅ ืื ืืึทืืข.
ืขืก ืืื ืืืขืจื ืฆื ืืึทืฆืึธืื ืืคืืขืจืงืืึทืืงืืื ืฆื ืื ืึธืืืืขืจืืึทืคึผ ืคืื ืงืึทืืืืึทืงืงืก ืืื ืื ืืจืืืก ื ืืืขืจ ืคืื }) ืืื ืื ืืขืฆื ืืืื ืคืื ืื ืงืึธื. ืขืก ืืื ืืขืจืืคื Callback Hell ืึธืืขืจ Pyramid of Doom.
ืื ืืืกืึทืืืืึทื ืืืืืฉืื ืคืื ืืขื ืืืคึฟื ืืขื ืขื ืงืืึธืจ ืืื ืืขืจ ืืึธื:
- ืืขื ืงืึธื ืืื ืฉืืืขืจ ืฆื ืืืืขื ืขื.
- ืขืก ืืื ืืืื ืฉืืืขืจ ืฆื ืฉืขืคึผื ืขืจืจืึธืจืก, ืืืึธืก ืึธืคื ืคืืจื ืฆื ื ืขืืขื ืงืึธื ืงืืืึทืืืืขื.
ืฆื ืกืึธืืืืข ืืขื ืคึผืจืึธืืืขื, ืืืืืืช ืืขื ืขื ืฆืืืขืืขืื ืฆื ืืืฉืึทืืืึทืกืงืจืืคึผื. ืืื ืืึธืื ืืืจ ืฆื ืคืึทืจืืืึทืื ืืืฃ ื ืขืกืืื ื ืคืื ืงืึทืืืืึทืงืงืก ืืื ืื ืืืึธืจื .ืืขืจื ืึธื.
ืื positive ืึทืกืคึผืขืงื ืคืื ืืืืืืช ืืื ืึทื ืืื ืืึทืื ืื ืงืึธื ืคืื ืืขืกืขืจ ืืืื ืขืืืืืง, ืคืื ืฉืคึผืืฅ ืฆื ืื ืึธ ืืื ืืื ืคืื ืืื ืงืก ืฆื ืจืขืื. ืึธืืขืจ, ืืืืืืช ืืืื ืืึธืื ืืืืขืจ ืคืจืืืืขืืขื:
- ืืืจ ืืึทืจืคึฟื ืฆื ืืืืื ืึท ืคึผืืึทืฅ ืคืื .ืืขืืึธืื.
- ืึทื ืฉืืึธื ืคึผืจืืืืจื / ืืึทืคึผื, .ืงืึทืืฉ ืืื ืืขื ืืฆื ืฆื ืฉืขืคึผื ืึทืืข ืขืจืจืึธืจืก.
- ืืจืืขืื ืืื ืงืืืคื ืืืืืืช ืืื ืืืื ืฉืืืืฃ ืืื ื ืื ืฉืืขื ืืืง ืืึทืงืืืขื; ืืื ืขืืืขืืข ืงืึทืกืขืก, ืืื ืงืึธืืคึผืืืฆืืจื ืื ืงืึธื.
ืืึธ ืืื ืึท ืคึผืจืึธืืืขื ืืืึธืก ืืืขื ืืืืึทืื ืื ืืืึทืืฉ ืคืื ืื ืืขืฆืืข ืคืื ื.
ืจืขืื ืืืจ ืืึธืื ืึท ืคึฟืึทืจ ืฉืืืืฃ ืืืึธืก ืคึผืจืื ืฅ ืึท ืกืืงืืืึทื ืก ืคืื ื ืืืขืจื ืคืื 0 ืฆื 10 ืืื ืืจืึทืค - ืื ืืขืจืืืึทืื (0-n ืกืขืงืื ืืขืก). ื ืืฆื ืืืืืืช, ืืืจ ืืึทืจืคึฟื ืฆื ืืืืฉื ืืขื ืฉืืืืฃ ืึทืืื ืึทื ืื ื ืืืขืจื ืืขื ืขื ืืขืืจืืงื ืืื ืกืืงืืืึทื ืก ืคืื 0 ืฆื 10. ืึทืืื, ืืืื ืขืก ื ืขืื 6 ืกืขืงืื ืืขืก ืฆื ืืจืืงื ืึท ื ืื ืืื 2 ืกืขืงืื ืืขืก ืฆื ืืจืืงื ืึท ืืืื, ืื ื ืื ืืึธื ืืืื ืืขืืจืืงื ืขืจืฉืืขืจ, ืืื ืืึทื ืื ืงืึธืื ืืืึธืืื ืคึฟืึทืจ ืืจืืงื ืืขืจ ืืืื ืขืจ ืืืขื ืึธื ืืืืื.
ืืื ืคืื ืงืืจืก, ืืืจ ืืึธื ื ืื ื ืืฆื ืึทืกืื ืง / ืึทืืืืื ืึธืืขืจ .ืกืึธืจื ืฆื ืกืึธืืืืข ืืขื ืคึผืจืึธืืืขื. ื ืืืืฉืคึผืื ืืืืืื ื ืืื ืืื ืื ืกืืฃ.
ืึทืกืื ืง ืคืึทื ืืงืฉืึทื ื
ืื ืึทืืืฉืึทื ืคืื ืึทืกืื ืง ืคืึทื ืืงืฉืึทื ื ืืื ES2017 (ES8) ืกืืืคึผืืึทืคืืื ืื ืึทืจืืขื ืคืื ืืจืืขืื ืืื ืืืืืืช. ืืื ืืึธื ืึทื ืึทืกืื ืง ืคืึทื ืืงืฉืึทื ื ืึทืจืืขื "ืืืืฃ ืฉืคึผืืฅ" ืคืื ืืืืืืช. ืื ืคืึทื ืืงืฉืึทื ื ืืึธื ื ืื ืคืึธืจืฉืืขืื ืงืืืึทืืึทืืืืืืืืื ืคืึทืจืฉืืืขื ืข ืงืึทื ืกืขืคึผืก. ืึทืกืื ืง ืคืึทื ืืงืฉืึทื ื ืืขื ืขื ืืืขื ืืื ืึทื ืึธืืืขืจื ืึทืืืื ืฆื ืงืึธื ืืืึธืก ื ืืฆื ืืืืืืช.
Async / Await ืืืื ืขืก ืืขืืืขื ืฆื ืึธืจืืึทื ืืืืจื ืึทืจืืขื ืืื ืืืกืื ืืงืจืึทื ืึทืก ืงืึธื ืืื ืึท ืกืื ืืฉืจืึธื ืึธืืก ื ืืกื.
ืืืื, ืืืืกื ืืืืืืช ืืืื ืขืก ืืจืื ืืขืจ ืฆื ืคึฟืึทืจืฉืืืื ืื ืคึผืจืื ืกืึทืคึผืึทืื ืคืื ืึทืกืื ืง / ืึทืืืืื.
ืกืื ืืึทืงืก
ื ืึธืจืืึทืืื ืขืก ืืืฉืืืื ืคืื ืฆืืืื ืืขืจืืื ืขื: ืึทืกืื ืง ืืื ืืขืจืืืึทืจืื. ืืขืจ ืขืจืฉืืขืจ ืืืึธืจื ืืืจื ืก ืื ืคึฟืื ืงืฆืืข ืืื ืืืกืื ืืงืจืึทื ืึทืก. ืึทืืึท ืคืึทื ืืงืฉืึทื ื ืืึธืื ืื ื ืืฆื ืคืื ืืขืจืืืึทืจืื. ืืื ืงืืื ืื ืืขืจืข ืคืึทื, ื ืืฆื ืืขื ืคึฟืื ืงืฆืืข ืืืขื ืืืฉืขื ืขืจืืื ืึท ืืขืืช.
// With function declaration
async function myFn() {
// await ...
}
// With arrow function
const myFn = async () => {
// await ...
}
function myFn() {
// await fn(); (Syntax Error since no 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! ืขืก ืืื ืืืขืจื ืฆื ืืขืืขื ืงืขื ืึทื ืงืืึทืก ืงืึทื ืกืืจืึทืงืืขืจื ืืื ืืขืืขืจ / ืกืขืืืขืจืก ืงืขื ืขื ื ืืฉื ืืืื ืืืกืื ืืงืจืึทื ืึทืก.
ืกืขืืึทื ืืืงืก ืืื ืืืจืืคืืจืื ื ืึผืืืื
ืึทืกืื ืง ืคืึทื ืืงืฉืึทื ื ืืขื ืขื ืืืืกืืงืื ืขื ืืขื ืฆื ื ืึธืจืืึทื JS ืคืึทื ืืงืฉืึทื ื, ืึธืืขืจ ืขืก ืืขื ืขื ืืืืกื ืขืืขื.
ืืืื, ืึทืกืื ืง ืคืึทื ืืงืฉืึทื ื ืฉืืขื ืืืง ืฆืืจืืงืงืืืขื ืืืืืืช:
async function fn() {
return 'hello';
}
fn().then(console.log)
// hello
ืกืคึผืขืฆืืขื, fn ืงืขืจื ืื ืฉืืจืืงื ืืขืื. ื ื, ืืื ื ืืึธืก ืืื ืึทื ืืืกืื ืืงืจืึทื ืึทืก ืคึฟืื ืงืฆืืข, ืื ืฉืืจืืงื ืืืขืจื ืืื ืืื ืืขืืืืงืื ืืื ืึท ืฆืืืึธื ื ืืฆื ืึท ืงืึธื ืกืืจืืงืืึธืจ.
ืืึธ ืืื ืึทื ืึธืืืขืจื ืึทืืืื ืคึผืืึทื ืึธื ืึทืกืื ืง:
function fn() {
return Promise.resolve('hello');
}
fn().then(console.log);
// hello
ืืื ืืขื ืคืึทื, ืื ืฆืืืึธื ืืื ืืืืืขืงืขืจื "ืืึทื ืืืึทืื". ืึท ืืืกืื ืืงืจืึทื ืึทืก ืคึฟืื ืงืฆืืข ืืื ืฉืืขื ืืืง ืืื ืืขืืืืงืื ืืื ืึท ื ืืึทืข ืฆืืืึธื.
ืืืื ืืขืจ ืฆืืจืืงืงืขืจ ืืืขืจื ืืื ืึท ืคึผืจืืืืืืื, ืื ืึทืกืื ืง ืคืื ืงืฆืืข ืงืขืจื ืื ืืืขืจื ืืืจื ืจืึทืคึผืื ื ืขืก ืืื ืึท ืฆืืืึธื. ืืืื ืืขืจ ืฆืืจืืงืงืขืจ ืืืขืจื ืืื ืึท ืฆืืืึธื ืืืืคืขืฅ, ืืืึทื ืืึทืืืึธืืข ืืื ืืืืืขืงืขืจื ืืื ืึท ื ืืึทืข ืฆืืืึธื.
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.
ืึทืกืื ืง ืคืึทื ืืงืฉืึทื ื ืฉืืขื ืืืง ืคึผืจืึธืืืฆืืจื ืึท ืฆืืืึธื, ืจืึทืืึทืจืืืึทืก ืคืื ืืืึธืก ืืื ืืืืืขืงืขืจื.
ืืืกืื ืืงืจืึทื ืึทืก ืคืึทื ืืงืฉืึทื ื ืคึผืืืืข ืืืืฃ ืืขืืขืจ ืืืึทืจืื.
ืืืึทืจืื ืึทืคืขืงืฅ ืืืืกืืจืืงื. ืึทืืื, ืืืื ืืขืจ ืืืืกืืจืืง ืืื ืึท ืฆืืืึธื, ืื ืึทืกืื ืง ืคืื ืงืฆืืข ืืื ืกืืกืคึผืขื ืืขื ืืื ืื ืฆืืืึธื ืืื ืืงืืื. ืืืื ืืขืจ ืืืืกืืจืืง ืืื ื ืืฉื ืึท ืฆืืืึธื, ืขืก ืืื ืงืึธื ืืืขืจืืขื ืฆื ืึท ืฆืืืึธื ืืืจื 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 ืคืื ืงืฆืืข ืึทืจืืขื.
- ื ืึธื ืจืืคื ืขืก, ืื ืขืจืฉืืขืจ ืฉืืจื ืืื ืงืึธื ืืืขืจืืขื ืคืื ืงืึธื ืกื ืึท = ืึทืืืืื 9; ืืื ืงืึธื ืกื ืึท = ืึทืืืืื ืคึผืจืึธืืืกืข.ืจืขืกืึธืืืืข (9);.
- ื ืึธื ื ืืฆื ืึทืืืืื, ืื ืืืจืืคืืจืื ื ืคืื ืื ืคึฟืื ืงืฆืืข ืืื ืกืืกืคึผืขื ืืขื ืืื ืึท ืืืขืจื (ืืื ืืขื ืงืจืึทื ื ืกืืืืึทืฆืืข ืืื 9).
- delayAndGetRandom (1000) ืคึผืึธืืึทื ืื ืืืจืืคืืจืื ื ืคืื ืื fn ืคืื ืงืฆืืข ืืื ืขืก ืงืึทืืคึผืืืฅ ืืื (ื ืึธื 1 ืจืืข). ืืขื ืืคืขืงืืืืืื ืกืืึทืคึผืก ืื fn ืคืื ืงืฆืืข ืคึฟืึทืจ 1 ืกืขืงืื ืืข.
- delayAndGetRandom (1000) ืืืจื ืจืขืกืึทืืืืข ืงืขืจื ืึท ืืจืึทืค ืืืขืจื, ืืืึธืก ืืื ืืขืืึธืื ืึทืกืืื ื ืฆื ืื ืืืึทืืขืืืืืง b.
- ื ื, ืืขืจ ืคืึทื ืืื ืืืึทืืขืืืืืง C ืืื ืขื ืืขื ืฆื ืื ืคืึทื ืืื ืืืึทืืขืืืืืง ืึท. ื ืึธื ืืขื, ืึทืืฅ ืกืืึทืคึผืก ืคึฟืึทืจ ืึท ืจืืข, ืึธืืขืจ ืืืฆื delayAndGetRandom (1000) ืงืขืจื ืืึธืจื ืืฉื ืืืืึทื ืขืก ืืื ื ืืฉื ืคืืจืืื ืื.
- ืืื ืึท ืจืขืืืืืึทื, ืื ืืืึทืืืขืก ืืขื ืขื ืงืึทืืงืืึทืืืืืื ืืื ืื ืคืึธืจืืืืข a + b * c. ืืขืจ ืจืขืืืืืึทื ืืื ืืื ืืขืืืืงืื ืืื ืึท ืฆืืืึธื ื ืืฆื Promise.resolve ืืื ืืืืืขืงืขืจื ืืืจื ืื ืคึฟืื ืงืฆืืข.
ืื ืคึผืึธืืึทื ืงืขื ืืืื ืจืขืืึทื ืืกืึทื ื ืคืื ืืขื ืขืจืึทืืึธืจืก ืืื ES6, ืึธืืขืจ ืขืก ืืื ืขืคึผืขืก ืฆื ืขืก
ืกืึทืืืืื ื ืื ืคึผืจืึธืืืขื
ื ื, ืืืฆื ืืึธืื ืก ืงืืง ืืื ืื ืืืืืื ื ืฆื ืืขื ืคึผืจืึธืืืขื ืืขืจืืื ื ืืืืื.
ืื FinishMyTask ืคืื ืงืฆืืข ื ืืฆื Await ืฆื ืืืึทืจืื ืคึฟืึทืจ ืื ืจืขืืืืืึทืื ืคืื ืึทืคึผืขืจืืืฉืึทื ื ืึทืืึท ืืื queryDatabase, sendEmail, logTaskInFile ืืื ืื ืืขืจืข. ืืืื ืืืจ ืคืึทืจืืืืึทืื ืืขื ืืืืืื ื ืืื ืืขืจ ืืืื ืขืจ ืืื ืืืืืืช ืืขื ืขื ืืขื ืืฆื, ืื ืกืืืึทืืขืจืึทืืื ืืืขื ืืืื ืงืืึธืจ ืืื ืืขืจ ืืึธื. ืึธืืขืจ, ืื Async / Await ืืืขืจืกืืข ืกืืืคึผืืึทืคืืื ืืืืขืจ ืึทืืข ืื ืกืื ืืึทืงืืืง ืงืึทืืคึผืืขืงืกืืืื. ืืื ืืขื ืคืึทื, ืขืก ืืื ืงืืื ืืจืืืก ื ืืืขืจ ืคืื ืงืึทืืืืึทืงืงืก ืืื ืงืืืื ืืื .ืืขืจื ืึธื/ืืึทืคึผื.
ืืึธ ืืื ืึท ืืืืืื ื ืืื ืื ืจืขืืืืืึทื ืคืื ื ืืืขืจื, ืขืก ืืขื ืขื ืฆืืืื ืึธืคึผืฆืืขืก.
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);
}
}
ืืขืืช ืคึผืจืึทืกืขืกืื ื
ืึทื ืืึทื ืืึทืื ืขืจืจืึธืจืก ืืขื ืขื ืืื ืืขืืืืงืื ืืื ืึท ืคืืจืืืืจืคื ืฆืืืึธื. ืึธืืขืจ, ืึทืกืื ืง ืคืึทื ืืงืฉืึทื ื ืงืขื ืขื ื ืืฆื ืคึผืจืืืืจื / ืืึทืคึผื ืฆื ืฉืขืคึผื ืขืจืจืึธืจืก ืกืื ืืงืจืึทื ืึทืกืื.
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 ืฆื ืืืกืคืืจื, ืืืื ืืืืืขื ืข ืืืจืืคืึทื ืืืขื ืจืขืืืืืึทื ืืื ืื ืืืจืืคืืจืื ื ืคืื ืื ืืึทืคึผื ืืืึธืง. ืืื ืึท ืจืขืืืืืึทื, ืื ืคึฟืื ืงืฆืืข ืคืึธืึธ ืืืขื ืกืืฃ ืืื ืึทื ืืืคืืื ื (ืืืขื ืืึธืจื ืืฉื ืืื ืืืืืขืงืขืจื ืืื ืื ืคึผืจืืืืจื ืืืึธืง) ืึธืืขืจ ืืื ืึท ืืขืืืคื ืืขืืช. ืืื ืึท ืจืขืืืืืึทื, ืื ืคืื ืงืฆืืข ืืืขื ื ืืฉื ืคืึทืจืืึธืื ืืืืึทื ืื ืคึผืจืืืืจื / ืืึทืคึผื ืืืขื ืฉืขืคึผื ืื ืคึฟืื ืงืฆืืข ืืื.
ืืึธ ืืื ืื ืื ืืขืจ ืืืึทืฉืคึผืื:
async function foo() {
try {
return canRejectOrReturn();
} catch (e) {
return 'error caught';
}
}
ืขืก ืืื ืืืขืจื ืฆื ืืึทืฆืึธืื ืืคืืขืจืงืืึทืืงืืื ืฆื ืื ืคืึทืงื ืึทื ืืื ืืขื ืืืึทืฉืคึผืื, canRejectOrReturn ืืื ืืืืืขืงืขืจื ืคึฟืื ืคื. Foo ืืื ืืขื ืคืึทื ืึธืืขืจ ืืขืจืืึทื ืืืฅ ืืื ืึท ืืื ืฅ ื ืืืขืจ ืึธืืขืจ ืงืขืจื ืึท ืืขืืช ("ืื ืืฉืืืืืื, ื ืืืขืจ ืฆื ืืจืืืก"). ืื ืืึทืคึผื ืืืึธืง ืืืขื ืงืืื ืืึธื ืืืื ืขืงืกืึทืงืืืืึทื.
ืื ืคึผืจืึธืืืขื ืืื ืึทื ืคืึธืึธ ืงืขืจื ืื ืฆืืืึธื ืืืจืืืขืืื ืืขื ืคึฟืื canRejectOrReturn. ืึทืืื ืื ืืืืืื ื ืฆื ืคืึธืึธ ืืืขืจื ืื ืืืืืื ื ืฆื ืงืขื ืขื ืจืขืืืฉืขืงื ืึธืืขืจ ืฆืืจืืงืงืืืขื. ืืื ืืขื ืคืึทื, ืื ืงืึธื ืืืขื ืฆืื ืืืคืฉืืขืื ืืื ืคืื ืืืืื ืฆืืืื ืฉืืจืืช:
try {
const promise = canRejectOrReturn();
return promise;
}
ืืึธ ืก ืืืึธืก ืืึทืคึผืึทื ื ืืืื ืืืจ ื ืืฆื ืึทืืืืื ืืื ืฆืืจืืงืงืืืขื ืฆืืืึทืืขื:
async function foo() {
try {
return await canRejectOrReturn();
} catch (e) {
return 'error caught';
}
}
ืืื ืืขื ืงืึธื ืืืืื, foo ืืืขื ืึทืจืืืกืืึทื ื ืืฆืืื ืืื ืืืืืข ืึท ืืื ืฅ ื ืืืขืจ ืืื ืึท ืืขืืืคื ืืขืืช. ืขืก ืืืขื ืืืื ืงืืื ืึธืคึผืืึธืื ืืึธ. ืึธืืขืจ ืคืึธืึธ ืืืขื ืฆืืจืืงืงืืืขื ืืื canRejectOrReturn, ื ืืฉื ืืื ืึทื ืืืคืืื ื. ืืื ืก ืืึทืื ืืืืขืจ ืคืื ืืขื ืืืจื ืจืืืืืืื ื ืื ืฆืืจืืงืงืืืขื ืึทืืืืื canRejectOrReturn () ืฉืืจื:
try {
const value = await canRejectOrReturn();
return value;
}
// โฆ
ืคึผืจืึธืกื ืืืกืืืืงืก ืืื ืคึผืืืคืึธืื
ืืื ืขืืืขืืข ืงืึทืกืขืก, ื ืืฆื Async / Await ืงืขื ืคืืจื ืฆื ืขืจืจืึธืจืก.
ืคืืจืืขืกื ืืขืจืืืึทืจืื
ืืึธืก ืืึทืคึผืึทื ื ืืึทื ืฅ ืึธืคื - ืื ืืืึทืจืื ืงืืืืขืจื ืืื ืคืืจืืขืกื ืืืืืขืจ ืื ืฆืืืึธื:
async function foo() {
try {
canRejectOrReturn();
} catch (e) {
return 'caught';
}
}
ืืื ืืืจ ืงืขื ืขื ืืขื, ืขืก ืืื ืงืืื ืืืึทืจืื ืึธืืขืจ ืฆืืจืืงืงืืืขื ืืื ืื ืงืึธื. ืืขืจืืืขืจ ืคืึธืึธ ืฉืืขื ืืืง ืขืืืื ืืื ืึทื ืืืคืืื ื ืึธื ืึท 1 ืจืืข ืคืึทืจืืึทืืื. ืืืขืจ ืื ืฆืืืึธื ืืืขื ืืงืืื ืืืขืจื. ืืืื ืขืก ืืืืจืคื ืขืจ ืึท ืืขืืช ืึธืืขืจ ืจืืืืฉืขืงืฉืึทื, UnhandledPromiseRejectionWarning ืืืขื ืืืื ืืขืจืืคึฟื.
ืึทืกืื ืง ืคืึทื ืืงืฉืึทื ื ืืื ืงืึทืืืืึทืงืงืก
ืึทืกืื ืง ืคืึทื ืืงืฉืึทื ื ืืขื ืขื ืืึทื ืฅ ืึธืคื ืืขื ืืฆื ืืื .ืืึทืคึผ ืึธืืขืจ .ืคืืืืขืจ ืืื ืงืึทืืืืึทืงืงืก. ืึท ืืืืฉืคึผืื ืืื ืื 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'];
}
ืืืจ ืืึทืจืคึฟื ืึทืจืคืึทืืกืึทืืืึทื, ืึธืงืืึธืงืึทื, ื ืึธืจืืืื ืึทืงืึทืื ืฅ. ืืื ืืขื ืคืึทื ืืืจ ืืึธื:
const users = [
'ArfatSalman',
'octocat',
'norvig'
];
const counts = users.map(async username => {
const count = await fetchPublicReposCount(username);
return count;
});
ืขืก ืืื ืืืขืจื ืฆื ืืึทืฆืึธืื ืืคืืขืจืงืืึทืืงืืื ืฆื Await ืืื ืื .ืืึทืคึผ ืงืึทืืืืึทืงืง. ืืึธ ืงืึทืื ืฅ ืืื ืึท ืืขื ืืข ืคืื โโืืืืืืช, ืืื .ืืึทืคึผ ืืื ืึทื ืึทื ืึธื ืืืข ืืึทื ืืฆืขืจืก ืงืึทืืืืึทืงืง ืคึฟืึทืจ ืืขืืขืจ ืกืคึผืขืกืืคืืขื ืืึทื ืืฆืขืจ.
ืึธืืืืขืจืื ืงืึธื ืกืืกืืขื ื ื ืืฆื ืคืื ืืขืจืืืึทืจืื
ืืึธืืืจ ื ืขืืขื ืืขื ืงืึธื ืืื ืึท ืืืึทืฉืคึผืื:
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;
}
ืืึธ ืื ืจืขืคึผืึธ ื ืืืขืจ ืืื ืืขืฉืืขืื ืืื ืื ืฆืืืื ืืืึทืืขืืืืืง, ืืื ืืขื ื ืืืขืจ ืืื ืืืกืืฃ ืฆื ืื ืงืึทืื ืฅ ืืขื ืืข. ืืขืจ ืคึผืจืึธืืืขื ืืื ืืขื ืงืึธื ืืื ืึทื ืืื ืืขืจ ืขืจืฉืืขืจ ืืึทื ืืฆืขืจ ืก ืืึทืื ืขืจืืืืื ืคืื ืื ืกืขืจืืืขืจ, ืึทืืข ืกืึทืืกืึทืงืืืึทื ื ื ืืฆืขืจืก ืืืขืื ืืืื ืืื ืกืืึทื ืืืื ืืึธืืข. ืืืื, ืืืืื ืืืื ืืึทื ืืฆืขืจ ืืื ืคึผืจืึทืกืขืกื ืืื ืึท ืฆืืึทื.
ืืืื, ืคึฟืึทืจ ืืืึทืฉืคึผืื, ืขืก ื ืขืื ืืืขืื 300 ืืื ืฆื ืคึผืจืึธืฆืขืก ืืืื ืืึทื ืืฆืขืจ, ืคึฟืึทืจ ืึทืืข ืืืืขืจื ืขืก ืืื ืฉืืื ืึท ืจืืข; ืื ืฆืืื ืคืืจืืจืืื ืืื ืขืึทืจืื ืืขืคึผืขื ืืก ืืืืฃ ืื ื ืืืขืจ ืคืื ื ืืฆืขืจืก. ืืืขืจ ืืื ื ืืืงืืืขื ืื ื ืืืขืจ ืคืื ืจืขืคึผืึธ ืืื ื ืืฉื ืึธืคืขื ืืขื ืืืืฃ ืืขืืขืจ ืื ืืขืจืขืจ, โโืื ืคึผืจืึทืกืขืกืึทื ืงืขื ืขื ืืืื ืคึผืึทืจืึทืืขืืืืขื. ืืึธืก ืืึทืจืฃ ืืจืืขืื ืืื .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 ืืืงืืื ืึท ืืขื ืืข ืคืื โโืืืืืืช ืืื ืึทืจืืึทื ืฉืจืืึทื ืืื ืงืขืจื ืึท ืฆืืืึธื. ืื ืืขื ืขืจ, ื ืึธื ืึทืืข ืืืืืืช ืืื ืื ืืขื ืืข ืืึธืื ืืขืขื ืืืงื ืึธืืขืจ ืืื ืืขืจ ืขืจืฉืืขืจ ืจืืืืฉืขืงืฉืึทื, ืืื ืืขืขื ืืืงื. ืขืก ืงืขื ืคึผืึทืกืืจื ืึทื ืืื ืึทืืข ืืึธื ื ืื ืึธื ืืืืื ืืื ืืขืจ ืืขืืืืงืขืจ ืฆืืื - ืืื ืกืืจ ืฆื ืขื ืฉืืจ ืกืืืืึทืืืืื ืืึทืก ืึธื ืืืื, ืืืจ ืงืขื ืขื ื ืืฆื ืคึผ-ืืึทืคึผืข.
ืกืึธืฃ
ืึทืกืื ืง ืคืึทื ืืงืฉืึทื ื ืืืขืจื ืื ืงืจืืกืื ืืื ืืืืืืืง ืคึฟืึทืจ ืึทื ืืืืืงืืื ื. ื ื, ืคึฟืึทืจ ืึทืืึทืคึผืืืื ื ืืฆื ืคืื ืึทืกืื ืง ืคืึทื ืืงืฉืึทื ื, ืืืจ ืืึธื ื ืืฆื
Skillbox ืจืขืงืึทืืขื ืื:
- ืคึผืจืึทืงืืืฉ ืงืืจืก
"ืืึธืืื ืืขืืืขืืึธืคึผืขืจ ืคึผืจืึธ" .- ืึทืคึผืคึผืืืขื ืึธื ืืืื ืงืืจืก
"ืืึทืืึท ืึทื ืึทืืืกื ืืื ืคึผืืืืึธื" .- ืฆืืืื-ืืึธืจ ืคึผืจืึทืงืืืฉ ืงืืจืก
"ืืื ืืื ืึท ืืืขื ืืขืืืขืืึธืคึผืขืจ ืคึผืจืึธ" .
ืืงืืจ: www.habr.com