ืœืึธืžื™ืจ ืงื•ืงืŸ ืื™ืŸ Async / Await ืื™ืŸ ื“ื–ืฉืึทื•ื•ืึทืกืงืจื™ืคึผื˜ ื ื™ืฆืŸ ื‘ื™ื™ืฉืคื™ืœืŸ

ื“ืขืจ ืžื—ื‘ืจ ืคื•ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ื™ื’ื–ืึทืžืึทื ื– ื‘ื™ื™ืฉืคื™ืœืŸ ืคื•ืŸ 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

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’