เชšเชพเชฒเซ‹ เช‰เชฆเชพเชนเชฐเชฃเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ JavaScript เชฎเชพเช‚ Async/Await เชœเซ‹เชˆเช

เชฒเซ‡เช–เชจเชพ เชฒเซ‡เช–เช• JavaScript เชฎเชพเช‚ Async/Await เชจเชพ เช‰เชฆเชพเชนเชฐเชฃเซ‹เชจเซ€ เชคเชชเชพเชธ เช•เชฐเซ‡ เช›เซ‡. เชเช•เช‚เชฆเชฐเซ‡, Async/Await เช เช…เชธเซเชฎเซ‡เชณ เช•เซ‹เชก เชฒเช–เชตเชพเชจเซ€ เช…เชจเซเช•เซ‚เชณ เชฐเซ€เชค เช›เซ‡. เช† เชธเซเชตเชฟเชงเชพ เชฆเซ‡เช–เชพเชฏ เชคเซ‡ เชชเชนเซ‡เชฒเชพเช‚, เช†เชตเชพ เช•เซ‹เชก เช•เซ‰เชฒเชฌเซ‡เช• เช…เชจเซ‡ เชตเชšเชจเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฒเช–เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เชนเชคเชพ. เชฎเซ‚เชณ เชฒเซ‡เช–เชจเชพ เชฒเซ‡เช–เช• เชตเชฟเชตเชฟเชง เช‰เชฆเชพเชนเชฐเชฃเซ‹เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเซ€เชจเซ‡ Async/Await เชจเชพ เชซเชพเชฏเชฆเชพเช“ เชฆเชฐเซเชถเชพเชตเซ‡ เช›เซ‡.

เช…เชฎเซ‡ เชฏเชพเชฆ เช•เชฐเชพเชตเซ€เช เช›เซ€เช: Habrเชจเชพ เชคเชฎเชพเชฎ เชตเชพเชšเช•เซ‹ เชฎเชพเชŸเซ‡ - Habr เชชเซเชฐเซ‹เชฎเซ‹ เช•เซ‹เชกเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เซ‹เชˆเชชเชฃ เชธเซเช•เชฟเชฒเชฌเซ‹เช•เซเชธ เช•เซ‹เชฐเซเชธเชฎเชพเช‚ เชจเซ‹เช‚เชงเชฃเซ€ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ 10 เชฐเซ‚เชฌเชฒ เชกเชฟเชธเซเช•เชพเช‰เชจเซเชŸ.

เชธเซเช•เชฟเชฒเชฌเซ‹เช•เซเชธ เชญเชฒเชพเชฎเชฃ เช•เชฐเซ‡ เช›เซ‡: เชถเซˆเช•เซเชทเชฃเชฟเช• เช“เชจเชฒเชพเชˆเชจ เช•เซ‹เชฐเซเชธ "เชœเชพเชตเชพ เชกเซ‡เชตเชฒเชชเชฐ".

เช•เซ‰เชฒเชฌเซ…เช•

เช•เซ‰เชฒเชฌเซ‡เช• เช เชเช• เช•เชพเชฐเซเชฏ เช›เซ‡ เชœเซ‡เชจเซ‹ เช•เซ‰เชฒ เช…เชจเชฟเชถเซเชšเชฟเชค เชธเชฎเชฏ เชฎเชพเชŸเซ‡ เชตเชฟเชฒเช‚เชฌเชฟเชค เช›เซ‡. เชชเชนเซ‡เชฒเชพเช‚, เช•เซ‹เชกเชจเชพ เชคเซ‡ เชตเชฟเชธเซเชคเชพเชฐเซ‹เชฎเชพเช‚ เช•เซ‰เชฒเชฌเซ…เช•เซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฅเชคเซ‹ เชนเชคเซ‹ เชœเซเชฏเชพเช‚ เชชเชฐเชฟเชฃเชพเชฎ เชคเชฐเชค เชœ เชฎเซ‡เชณเชตเซ€ เชถเช•เชพเชคเซเช‚ เชจ เชนเชคเซเช‚.

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 เชซเชพเช‡เชฒเชฎเชพเช‚ เชฆเชพเช–เชฒ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชœเซ‡ เชคเชพเชฐเซ€เช– เชฆเชฐเซเชถเชพเชตเซ‡ เช›เซ‡.

เช•เซ‹เชกเชจเชพ เช…เช‚เชคเชฟเชฎ เชญเชพเช—เชฎเชพเช‚ เช•เซ‰เชฒเชฌเซ…เช•เซเชธเชจเชพ เช“เชตเชฐเชฒเซ‡เชช เช…เชจเซ‡ เชฎเซ‹เชŸเซ€ เชธเช‚เช–เซเชฏเชพเชฎเชพเช‚ }) เชชเชฐ เชงเซเชฏเชพเชจ เช†เชชเชตเซเช‚ เชฏเซ‹เช—เซเชฏ เช›เซ‡. เชคเซ‡เชจเซ‡ เช•เซ‰เชฒเชฌเซ‡เช• เชนเซ‡เชฒ เช…เชฅเชตเชพ เชชเชฟเชฐเชพเชฎเชฟเชก เช“เชซ เชกเซ‚เชฎ เช•เชนเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เช† เชชเชฆเซเชงเชคเชฟเชจเชพ เช—เซ‡เชฐเชซเชพเชฏเชฆเชพ เชธเซเชชเชทเซเชŸ เช›เซ‡:

  • เช† เช•เซ‹เชก เชตเชพเช‚เชšเชตเซ‹ เชฎเซเชถเซเช•เซ‡เชฒ เช›เซ‡.
  • เชญเซ‚เชฒเซ‹เชจเซ‡ เชจเชฟเชฏเช‚เชคเซเชฐเชฟเชค เช•เชฐเชตเซ€ เชชเชฃ เชฎเซเชถเซเช•เซ‡เชฒ เช›เซ‡, เชœเซ‡ เช˜เชฃเซ€เชตเชพเชฐ เชจเชฌเชณเซ€ เช•เซ‹เชก เช—เซเชฃเชตเชคเซเชคเชพ เชคเชฐเชซ เชฆเซ‹เชฐเซ€ เชœเชพเชฏ เช›เซ‡.

เช† เชธเชฎเชธเซเชฏเชพเชจเซ‡ เช‰เช•เซ‡เชฒเชตเชพ เชฎเชพเชŸเซ‡, JavaScript เชฎเชพเช‚ เชตเชšเชจเซ‹ เช‰เชฎเซ‡เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เชนเชคเชพ. เชคเซ‡เช“ เชคเชฎเชจเซ‡ เช•เซ‰เชฒเชฌเซ…เช•เซเชธเชจเชพ เชŠเช‚เชกเชพ เชฎเชพเชณเช–เชพเชจเซ‡ เชถเชฌเซเชฆ เชธเชพเชฅเซ‡ เชฌเชฆเชฒเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡. เชชเช›เซ€.

เชตเชšเชจเซ‹เชจเซเช‚ เชธเช•เชพเชฐเชพเชคเซเชฎเช• เชชเชพเชธเซเช‚ เช เช›เซ‡ เช•เซ‡ เชคเซ‡เช“ เช•เซ‹เชกเชจเซ‡ เชกเชพเชฌเซ‡เชฅเซ€ เชœเชฎเชฃเซ‡ เช•เชฐเชตเชพเชจเซ‡ เชฌเชฆเชฒเซ‡ เช‰เชชเชฐเชฅเซ€ เชจเซ€เชšเซ‡ เชธเซเชงเซ€ เชตเชงเซ เชธเชพเชฐเซ€ เชฐเซ€เชคเซ‡ เชตเชพเช‚เชšเชตเชพ เชฏเซ‹เช—เซเชฏ เชฌเชจเชพเชตเซ‡ เช›เซ‡. เชœเซ‹ เช•เซ‡, เชตเชšเชจเซ‹เชจเซ€ เชชเชฃ เชคเซ‡เชฎเชจเซ€ เชธเชฎเชธเซเชฏเชพเช“ เช›เซ‡:

  • เชคเชฎเชพเชฐเซ‡ เช˜เชฃเซเช‚ เช‰เชฎเซ‡เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชชเช›เซ€.
  • เชŸเซเชฐเชพเชฏ/เช•เซ‡เชšเชจเซ‡ เชฌเชฆเชฒเซ‡, เชฌเชงเซ€ เชญเซ‚เชฒเซ‹เชจเซ‡ เชนเซ‡เชจเซเชกเชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ .catch เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฅเชพเชฏ เช›เซ‡.
  • เชเช• เชฒเซ‚เชชเชฎเชพเช‚ เชฌเชนเซเชตเชฟเชง เชตเชšเชจเซ‹ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเซเช‚ เชนเช‚เชฎเซ‡เชถเชพ เช…เชจเซเช•เซ‚เชณ เชนเซ‹เชคเซเช‚ เชจเชฅเซ€; เช•เซ‡เชŸเชฒเชพเช• เช•เชฟเชธเซเชธเชพเช“เชฎเชพเช‚, เชคเซ‡เช“ เช•เซ‹เชกเชจเซ‡ เชœเชŸเชฟเชฒ เชฌเชจเชพเชตเซ‡ เช›เซ‡.

เช…เชนเซ€เช‚ เชเช• เชธเชฎเชธเซเชฏเชพ เช›เซ‡ เชœเซ‡ เช›เซ‡เชฒเซเชฒเชพ เชฎเซเชฆเซเชฆเชพเชจเซ‹ เช…เชฐเซเชฅ เชฌเชคเชพเชตเชถเซ‡.

เชงเชพเชฐเซ‹ เช•เซ‡ เช†เชชเชฃเซ€ เชชเชพเชธเซ‡ เชฒเซ‚เชช เชฎเชพเชŸเซ‡ เช›เซ‡ เชœเซ‡ เชฐเซ‡เชจเซเชกเชฎ เช…เช‚เชคเชฐเชพเชฒเซ‹ (0โ€“n เชธเซ‡เช•เช‚เชก) เชชเชฐ 10 เชฅเซ€ 0 เชธเซเชงเซ€เชจเซ€ เชธเช‚เช–เซเชฏเชพเช“เชจเซ‹ เช•เซเชฐเชฎ เช›เชพเชชเซ‡ เช›เซ‡. เชตเชšเชจเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡, เชคเชฎเชพเชฐเซ‡ เช† เชฒเซ‚เชช เชฌเชฆเชฒเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เชœเซ‡เชฅเซ€ เช•เชฐเซ€เชจเซ‡ เชจเช‚เชฌเชฐเซ‹ 0 เชฅเซ€ 10 เชธเซเชงเซ€เชจเชพ เช•เซเชฐเชฎเชฎเชพเช‚ เช›เชพเชชเชตเชพเชฎเชพเช‚ เช†เชตเซ‡. เชคเซ‡เชฅเซ€, เชœเซ‹ เชถเซ‚เชจเซเชฏ เช›เชพเชชเชตเชพเชฎเชพเช‚ 6 เชธเซ‡เช•เชจเซเชก เช…เชจเซ‡ เชเช• เช›เชพเชชเชตเชพเชฎเชพเช‚ 2 เชธเซ‡เช•เชจเซเชกเชจเซ‹ เชธเชฎเชฏ เชฒเชพเช—เซ‡, เชคเซ‹ เชถเซ‚เชจเซเชฏ เชชเซเชฐเชฅเชฎ เชชเซเชฐเชฟเชจเซเชŸ เชฅเชตเซ‹ เชœเซ‹เชˆเช, เช…เชจเซ‡ เชชเช›เซ€ เชเช• เช›เชพเชชเชตเชพ เชฎเชพเชŸเซ‡เชจเซเช‚ เช•เชพเช‰เชจเซเชŸเชกเชพเช‰เชจ เชถเชฐเซ‚ เชฅเชถเซ‡.

เช…เชจเซ‡ เช…เชฒเชฌเชคเซเชค, เช…เชฎเซ‡ เช† เชธเชฎเชธเซเชฏเชพเชจเซ‡ เช‰เช•เซ‡เชฒเชตเชพ เชฎเชพเชŸเซ‡ Async/Await เช…เชฅเชตเชพ .sort เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชคเชพ เชจเชฅเซ€. เชเช• เช‰เชฆเชพเชนเชฐเชฃ เช‰เช•เซ‡เชฒ เช…เช‚เชคเซ‡ เช›เซ‡.

Async เช•เชพเชฐเซเชฏเซ‹

ES2017 (ES8) เชฎเชพเช‚ async เช•เชพเชฐเซเชฏเซ‹เชจเชพ เช‰เชฎเซ‡เชฐเชพเชฅเซ€ เชตเชšเชจเซ‹ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพเชจเซเช‚ เช•เชพเชฐเซเชฏ เชธเชฐเชณ เชฌเชจเซเชฏเซเช‚ เช›เซ‡. เชนเซเช‚ เชจเซ‹เช‚เชงเซเช‚ เช›เซเช‚ เช•เซ‡ async เช•เชพเชฐเซเชฏเซ‹ เชตเชšเชจเซ‹เชจเซ€ "เชŸเซ‹เชš เชชเชฐ" เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡. เช† เช•เชพเชฐเซเชฏเซ‹ เช—เซเชฃเชพเชคเซเชฎเช• เชฐเซ€เชคเซ‡ เช…เชฒเช— เช–เซเชฏเชพเชฒเซ‹เชจเซเช‚ เชชเซเชฐเชคเชฟเชจเชฟเชงเชฟเชคเซเชต เช•เชฐเชคเชพ เชจเชฅเซ€. Async เชซเช‚เช•เซเชถเชจเชจเซ‹ เชนเซ‡เชคเซ เช•เซ‹เชกเชจเชพ เชตเชฟเช•เชฒเซเชช เชคเชฐเซ€เช•เซ‡ เช›เซ‡ เชœเซ‡ เชตเชšเชจเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡.

Async/Await เช เชธเชฟเช‚เช•เซเชฐเชจเชธ เชถเซˆเชฒเซ€เชฎเชพเช‚ เช…เชธเซเชฎเซ‡เชณ เช•เซ‹เชก เชธเชพเชฅเซ‡ เช•เชพเชฐเซเชฏ เช—เซ‹เช เชตเชตเชพเชจเซเช‚ เชถเช•เซเชฏ เชฌเชจเชพเชตเซ‡ เช›เซ‡.

เช†เชฎ, เชตเชšเชจเซ‹ เชœเชพเชฃเชตเชพเชฅเซ€ Async/Await เชจเชพ เชธเชฟเชฆเซเชงเชพเช‚เชคเซ‹เชจเซ‡ เชธเชฎเชœเชตเชพเชฎเชพเช‚ เชธเชฐเชณเชคเชพ เชฐเชนเซ‡ เช›เซ‡.

เชตเชพเช•เซเชฏเชฐเชšเชจเชพ

เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชคเซ‡ เชฌเซ‡ เช•เซ€เชตเชฐเซเชกเซเชธ เชงเชฐเชพเชตเซ‡ เช›เซ‡: 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)
}
 

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 เช•เชพเชฐเซเชฏเซ‹ เชนเช‚เชฎเซ‡เชถเชพ เชตเชšเชจเซ‹ เช†เชชเซ‡ เช›เซ‡:

async function fn() {
  return 'hello';
}
fn().then(console.log)
// hello

เช–เชพเชธ เช•เชฐเซ€เชจเซ‡, fn เชถเชฌเซเชฆเชฎเชพเชณเชพ เชนเซ‡เชฒเซ‹ เชชเชฐเชค เช•เชฐเซ‡ เช›เซ‡. เช เซ€เช• เช›เซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เช† เชเช• เช…เชธเซเชฎเซ‡เชณ เช•เชพเชฐเซเชฏ เช›เซ‡, เชธเซเชŸเซเชฐเชฟเช‚เช— เชฎเซ‚เชฒเซเชฏ เช•เชจเซเชธเซเชŸเซเชฐเช•เซเชŸเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชตเชšเชจเชฎเชพเช‚ เช†เชตเชฐเชฟเชค เช›เซ‡.

เช…เชนเซ€เช‚ 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.resolve เชจเซ‡ เชฌเชฆเชฒเซ‡ เชญเซ‚เชฒ เชงเชฐเชพเชตเชคเซเช‚ Promise.reject เชชเชฐเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.

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 เชฎเชพเช‚เชฅเซ€ เชฐเซ‚เชชเชพเช‚เชคเชฐเชฟเชค เชฅเชพเชฏ เช›เซ‡; in const a = เชฐเชพเชน เชœเซเช“ Promise.resolve(9);
  • Await เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชซเช‚เช•เซเชถเชจ เชเช•เซเชเซ‡เช•เซเชฏเซเชถเชจเชจเซ‡ เชคเซ‡เชจเซ€ เช•เชฟเช‚เชฎเชค เชจ เชฎเชณเซ‡ เชคเซเชฏเชพเช‚ เชธเซเชงเซ€ เชธเชธเซเชชเซ‡เชจเซเชก เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ (เชตเชฐเซเชคเชฎเชพเชจ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟเชฎเชพเช‚ เชคเซ‡ 9 เช›เซ‡).
  • delayAndGetRandom(1000) fn เชซเช‚เช•เซเชถเชจเชจเชพ เชเช•เซเชเซ‡เช•เซเชฏเซเชถเชจเชจเซ‡ เชคเซเชฏเชพเช‚ เชธเซเชงเซ€ เชฅเซ‹เชญเชพเชตเซ‡ เช›เซ‡ เชœเซเชฏเชพเช‚ เชธเซเชงเซ€ เชคเซ‡ เชชเซ‚เชฐเซเชฃ เชจ เชฅเชพเชฏ (1 เชธเซ‡เช•เชจเซเชก เชชเช›เซ€). เช† เช…เชธเชฐเช•เชพเชฐเช• เชฐเซ€เชคเซ‡ 1 เชธเซ‡เช•เชจเซเชก เชฎเชพเชŸเซ‡ fn เชซเช‚เช•เซเชถเชจเชจเซ‡ เชฐเซ‹เช•เซ‡ เช›เซ‡.
  • เชฐเชฟเชเซ‹เชฒเซเชฏเซเชถเชจ เชฆเซเชตเชพเชฐเชพ delayAndGetRandom(1000) เชฐเซ‡เชจเซเชกเชฎ เชฎเซ‚เชฒเซเชฏ เช†เชชเซ‡ เช›เซ‡, เชœเซ‡ เชชเช›เซ€ เชšเชฒ b เชจเซ‡ เชธเซ‹เช‚เชชเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.
  • เช เซ€เช• เช›เซ‡, เชšเชฒ c เชธเชพเชฅเซ‡เชจเซ‹ เช•เซ‡เชธ เชšเชฒ a เชธเชพเชฅเซ‡เชจเชพ เช•เซ‡เชธ เชœเซ‡เชตเซ‹ เชœ เช›เซ‡. เชคเซ‡ เชชเช›เซ€, เชฌเชงเซเช‚ เชเช• เชธเซ‡เช•เชจเซเชก เชฎเชพเชŸเซ‡ เช…เชŸเช•เซ€ เชœเชพเชฏ เช›เซ‡, เชชเชฐเช‚เชคเซ เชนเชตเซ‡ เชตเชฟเชฒเช‚เชฌ เชเช‚เชกเช—เซ‡เชŸเชฐเซ‡เชจเซเชกเชฎ(1000) เช•เช‚เชˆเชชเชฃ เชชเชพเช›เซเช‚ เช†เชชเชคเซเช‚ เชจเชฅเซ€ เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡ เชœเชฐเซ‚เชฐเซ€ เชจเชฅเซ€.
  • เชชเชฐเชฟเชฃเชพเชฎเซ‡, เชฎเซ‚เชฒเซเชฏเซ‹เชจเซ€ เช—เชฃเชคเชฐเซ€ เชซเซ‹เชฐเซเชฎเซเชฏเซเชฒเชพ a + b * c เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชชเชฐเชฟเชฃเชพเชฎ Promise.resolve เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชตเชšเชจเชฎเชพเช‚ เช†เชตเชฐเชฟเชค เช›เซ‡ เช…เชจเซ‡ เชซเช‚เช•เซเชถเชจ เชฆเซเชตเชพเชฐเชพ เชชเชฐเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เช† เชตเชฟเชฐเชพเชฎ ES6 เชฎเชพเช‚ เชœเชจเชฐเซ‡เชŸเชฐเชจเซ€ เชฏเชพเชฆ เช…เชชเชพเชตเซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เชคเซ‡เชฎเชพเช‚ เช•เช‚เชˆเช• เช›เซ‡ เชคเชฎเชพเชฐเชพ เช•เชพเชฐเชฃเซ‹.

เชธเชฎเชธเซเชฏเชพเชจเซเช‚ เชจเชฟเชฐเชพเช•เชฐเชฃ

เชตเซ‡เชฒ, เชนเชตเซ‡ เช†เชชเชฃเซ‡ เช‰เชชเชฐ เชœเชฃเชพเชตเซ‡เชฒ เชธเชฎเชธเซเชฏเชพเชจเซ‹ เช‰เช•เซ‡เชฒ เชœเซ‹เชˆเช.

FinishMyTask เชซเช‚เช•เซเชถเชจ queryDatabase, sendEmail, logTaskInFile เช…เชจเซ‡ เช…เชจเซเชฏ เชœเซ‡เชตเชพ เช“เชชเชฐเซ‡เชถเชจเชจเชพ เชชเชฐเชฟเชฃเชพเชฎเซ‹เชจเซ€ เชฐเชพเชน เชœเซ‹เชตเชพ เชฎเชพเชŸเซ‡ Await เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡. เชœเซ‹ เชคเชฎเซ‡ เช† เชธเซ‹เชฒเซเชฏเซเชถเชจเชจเซ€ เชคเซเชฒเชจเชพ เชคเซ‡ เชธเชพเชฅเซ‡ เช•เชฐเซ‹ เชœเซเชฏเชพเช‚ เชตเชšเชจเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹, เชคเซ‹ เชธเชฎเชพเชจเชคเชพเช“ เชธเซเชชเชทเซเชŸ เชฅเชˆ เชœเชถเซ‡. เชœเซ‹ เช•เซ‡, 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 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 เช•เซเชฏเชพเช‚ เชคเซ‹ เช…เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เชธเชพเชฅเซ‡ เชธเชฎเชพเชชเซเชค เชฅเชถเซ‡ (เชœเซเชฏเชพเชฐเซ‡ เชŸเซเชฐเชพเชฏ เชฌเซเชฒเซ‹เช•เชฎเชพเช‚ เช•เช‚เชˆ เชชเชพเช›เซเช‚ เชฎเชณเชคเซเช‚ เชจเชฅเซ€) เช…เชฅเชตเชพ เช•เซ‡เชš เชฅเชฏเซ‡เชฒเซ€ เชญเซ‚เชฒ เชธเชพเชฅเซ‡. เชชเชฐเชฟเชฃเชพเชฎเซ‡, เช† เชซเช‚เช•เซเชถเชจ เชจเชฟเชทเซเชซเชณ เชœเชถเซ‡ เชจเชนเซ€เช‚ เช•เชพเชฐเชฃ เช•เซ‡ เชŸเซเชฐเชพเชฏ/เช•เซ‡เชš เชซเช‚เช•เซเชถเชจ foo เชจเซ‡ เชœ เชนเซ‡เชจเซเชกเชฒ เช•เชฐเชถเซ‡.

เช…เชนเซ€เช‚ เชฌเซ€เชœเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ เช›เซ‡:

async function foo() {
  try {
    return canRejectOrReturn();
  } catch (e) {
    return 'error caught';
  }
}

เชคเซ‡ เชนเช•เซ€เช•เชค เชชเชฐ เชงเซเชฏเชพเชจ เช†เชชเชตเซเช‚ เชฏเซ‹เช—เซเชฏ เช›เซ‡ เช•เซ‡ เช‰เชฆเชพเชนเชฐเชฃเชฎเชพเช‚, canRejectOrReturn 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 เชธเชพเชฅเซ‡ เชชเชฐเชค เช†เชตเชถเซ‡, undefined เชธเชพเชฅเซ‡ เชจเชนเซ€เช‚. เชšเชพเชฒเซ‹ เชฐเซ€เชŸเชฐเซเชจ await canRejectOrReturn() เชฒเชพเช‡เชจเชจเซ‡ เชฆเซ‚เชฐ เช•เชฐเซ€เชจเซ‡ เชคเซ‡เชจเซ€ เช–เชพเชคเชฐเซ€ เช•เชฐเซ€เช:

try {
    const value = await canRejectOrReturn();
    return value;
}
// โ€ฆ

เชธเชพเชฎเชพเชจเซเชฏ เชญเซ‚เชฒเซ‹ เช…เชจเซ‡ เชฎเซเชถเซเช•เซ‡เชฒเซ€เช“

เช•เซ‡เชŸเชฒเชพเช• เช•เชฟเชธเซเชธเชพเช“เชฎเชพเช‚, Async/Await เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฅเซ€ เชญเซ‚เชฒเซ‹ เชฅเชˆ เชถเช•เซ‡ เช›เซ‡.

เชฐเชพเชน เชญเซ‚เชฒเซ€ เช—เชฏเชพ

เช† เช˜เชฃเซ€ เชตเชพเชฐ เชฅเชพเชฏ เช›เซ‡ - await เช•เซ€เชตเชฐเซเชก เชตเชšเชจ เชชเชนเซ‡เชฒเชพเช‚ เชญเซ‚เชฒเซ€ เชœเชพเชฏ เช›เซ‡:

async function foo() {
  try {
    canRejectOrReturn();
  } catch (e) {
    return 'caught';
  }
}

เชœเซ‡เชฎ เชคเชฎเซ‡ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹, เช•เซ‹เชกเชฎเชพเช‚ เช•เซ‹เชˆ เชฐเชพเชน เช•เซ‡ เชตเชณเชคเชฐ เชจเชฅเซ€. เชคเซ‡เชฅเซ€ foo เชนเช‚เชฎเซ‡เชถเชพ 1 เชธเซ‡เช•เชจเซเชกเชจเชพ เชตเชฟเชฒเช‚เชฌ เชตเชฟเชจเชพ เช…เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เชธเชพเชฅเซ‡ เชฌเชนเชพเชฐ เชจเซ€เช•เชณเซ‡ เช›เซ‡. เชชเชฐเช‚เชคเซ เชตเชšเชจ เชชเซ‚เชฐเซเชฃ เชฅเชถเซ‡. เชœเซ‹ เชคเซ‡ เชญเซ‚เชฒ เช…เชฅเชตเชพ เช…เชธเซเชตเซ€เช•เชพเชฐ เชซเซ‡เช‚เช•เซ‡ เช›เซ‡, เชคเซ‹ UnhandledPromiseRejectionWarning เช•เชนเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.

เช•เซ‰เชฒเชฌเซ…เช•เซเชธเชฎเชพเช‚ Async เช•เชพเชฐเซเชฏเซ‹

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'];
}

เช…เชฎเชจเซ‡ เช…เชฐเชซเชค เชธเชฒเชฎเชพเชจ, เช“เช•เซเชŸเซ‹เช•เซ‡เชŸ, เชจเซ‹เชฐเซเชตเชฟเช— เชเช•เชพเช‰เชจเซเชŸเซเชธเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เช…เชฎเซ‡ เช•เชฐเซ€เช เช›เซ€เช:

const users = [
  'ArfatSalman',
  'octocat',
  'norvig'
];
 
const counts = users.map(async username => {
  const count = await fetchPublicReposCount(username);
  return count;
});

.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;
}

เช…เชนเซ€เช‚ เชฐเซ‡เชชเซ‹ เชจเช‚เชฌเชฐ เช•เชพเช‰เชจเซเชŸ เชตเซ‡เชฐเซ€เชเชฌเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชชเช›เซ€ เช† เชจเช‚เชฌเชฐ เช•เชพเช‰เชจเซเชŸเซเชธ เชเชฐเซ‡เชฎเชพเช‚ เช‰เชฎเซ‡เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช•เซ‹เชกเชจเซ€ เชธเชฎเชธเซเชฏเชพ เช เช›เซ‡ เช•เซ‡ เชธเชฐเซเชตเชฐเชฎเชพเช‚เชฅเซ€ เชชเซเชฐเชฅเชฎ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ‹ เชกเซ‡เชŸเชพ เช†เชตเซ‡ เชคเซเชฏเชพเช‚ เชธเซเชงเซ€, เชชเช›เซ€เชจเชพ เชฌเชงเชพ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชธเซเชŸเซ‡เชจเซเชกเชฌเชพเชฏ เชฎเซ‹เชกเชฎเชพเช‚ เชนเชถเซ‡. เช†เชฎ, เชเช• เชธเชฎเชฏเซ‡ เชฎเชพเชคเซเชฐ เชเช• เชœ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เชœเซ‹, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชเช• เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เชฒเช—เชญเช— 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 เช‡เชจเชชเซเชŸ เชคเชฐเซ€เช•เซ‡ เชตเชšเชจเซ‹เชจเซ€ เชถเซเชฐเซ‡เชฃเซ€ เชฎเซ‡เชณเชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เชตเชšเชจ เชชเชฐเชค เช•เชฐเซ‡ เช›เซ‡. เชฌเชพเชฆเชฎเชพเช‚, เชเชฐเซ‡เชฎเชพเช‚เชจเชพ เชฌเชงเชพ เชตเชšเชจเซ‹ เชชเซ‚เชฐเซเชฃ เชฅเชฏเชพ เชชเช›เซ€ เช…เชฅเชตเชพ เชชเซเชฐเชฅเชฎ เช…เชธเซเชตเซ€เช•เชพเชฐ เชธเชฎเชฏเซ‡, เชชเซ‚เชฐเซเชฃ เชฅเชพเชฏ เช›เซ‡. เชเชตเซเช‚ เชฌเชจเซ€ เชถเช•เซ‡ เช›เซ‡ เช•เซ‡ เชคเซ‡ เชฌเชงเชพ เชเช• เชœ เชธเชฎเชฏเซ‡ เชถเชฐเซ‚ เชฅเชคเชพ เชจเชฅเซ€ - เชเช• เชธเชพเชฅเซ‡ เชถเชฐเซ‚เช†เชคเชจเซ€ เช–เชพเชคเชฐเซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเซ‡ p-map เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.

เชจเชฟเชทเซเช•เชฐเซเชท

Async เช•เชพเชฐเซเชฏเซ‹ เชตเชฟเช•เชพเชธ เชฎเชพเชŸเซ‡ เชตเชงเซเชจเซ‡ เชตเชงเซ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เชฌเชจเซ€ เชฐเชนเซเชฏเชพ เช›เซ‡. เช เซ€เช• เช›เซ‡, async เช•เชพเชฐเซเชฏเซ‹เชจเชพ เช…เชจเซเช•เซ‚เชฒเชจเชถเซ€เชฒ เช‰เชชเชฏเซ‹เช— เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹ เชœเซ‹เชˆเช Async Iterators. เชœเชพเชตเชพเชธเซเช•เซเชฐเชฟเชชเซเชŸ เชกเซ‡เชตเชฒเชชเชฐ เช†เชฎเชพเช‚ เชธเชพเชฐเซ€ เชฐเซ€เชคเซ‡ เชตเชพเช•เซ‡เชซ เชนเซ‹เชตเชพ เชœเซ‹เชˆเช.

เชธเซเช•เชฟเชฒเชฌเซ‹เช•เซเชธ เชญเชฒเชพเชฎเชฃ เช•เชฐเซ‡ เช›เซ‡:

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹