เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต 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-เตฝ เดตเดพเด—เตเดฆเดพเดจเด™เตเด™เตพ เดšเต‡เตผเดคเตเดคเต. .เดชเดฟเดจเตเดจเต† เดŽเดจเตเดจ เดตเดพเด•เตเด•เต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด•เต‹เตพเดฌเดพเด•เตเด•เตเด•เดณเตเดŸเต† เด†เดดเดคเตเดคเดฟเดฒเตเดณเตเดณ เดจเต†เดธเตเดฑเตเดฑเดฟเด‚เด—เต เดฎเดพเดฑเตเดฑเดฟเดธเตเดฅเดพเดชเดฟเด•เตเด•เดพเตป เด…เดต เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต.

เดตเดพเด—เตเดฆเดพเดจเด™เตเด™เดณเตเดŸเต† เดชเต‹เดธเดฟเดฑเตเดฑเต€เดตเต เดตเดถเด‚, เด…เดต เด•เต‹เดกเต เด‡เดŸเดคเตเดคเตเดจเดฟเดจเตเดจเต เดตเดฒเดคเตเดคเต‹เดŸเตเดŸเต เดตเดพเดฏเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดชเด•เดฐเด‚ เดฎเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดคเดพเดดเต‡เด•เตเด•เต เด•เต‚เดŸเตเดคเตฝ เดฎเดฟเด•เดšเตเดšเดคเดพเด•เตเด•เตเดจเตเดจเต เดŽเดจเตเดจเดคเดพเดฃเต. เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดตเดพเด—เตเดฆเดพเดจเด™เตเด™เตพเด•เตเด•เตเด‚ เด…เดตเดฐเตเดŸเต† เดชเตเดฐเดถเตเดจเด™เตเด™เดณเตเดฃเตเดŸเต:

  • เดจเดฟเด™เตเด™เตพ เด’เดฐเตเดชเดพเดŸเต .เด…เดชเตเดชเต‹เตพ เดšเต‡เตผเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต.
  • try/catch เดŽเดจเตเดจเดคเดฟเดจเตเดชเด•เดฐเด‚, เดŽเดฒเตเดฒเดพ เดชเดฟเดถเด•เตเด•เดณเตเด‚ เด•เตˆเด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเดพเตป .catch เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต.
  • เด’เดฐเต เดฒเต‚เดชเตเดชเดฟเดจเตเดณเตเดณเดฟเตฝ เด’เดจเตเดจเดฟเดฒเดงเดฟเด•เด‚ เดตเดพเด—เตเดฆเดพเดจเด™เตเด™เดณเตเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเต เดŽเดฒเตเดฒเดพเดฏเตเดชเตเดชเต‹เดดเตเด‚ เดธเต—เด•เดฐเตเดฏเดชเตเดฐเดฆเดฎเดฒเตเดฒ; เดšเดฟเดฒ เดธเดจเตเดฆเตผเดญเด™เตเด™เดณเดฟเตฝ, เด…เดต เด•เต‹เดกเต เดธเด™เตเด•เต€เตผเดฃเตเดฃเดฎเดพเด•เตเด•เตเดจเตเดจเต.

เด…เดตเดธเดพเดจ เดชเต‹เดฏเดฟเดจเตเดฑเดฟเดจเตเดฑเต† เด…เตผเดคเตเดฅเด‚ เด•เดพเดฃเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดชเตเดฐเดถเตเดจเด‚ เด‡เดคเดพ.

เด•เตเดฐเดฎเดฐเดนเดฟเดคเดฎเดพเดฏ เด‡เดŸเดตเต‡เดณเด•เดณเดฟเตฝ (0โ€“n เดธเต†เด•เตเด•เตปเดกเต) 10 เดฎเตเดคเตฝ 0 เดตเดฐเต†เดฏเตเดณเตเดณ เดธเด‚เด–เตเดฏเด•เดณเตเดŸเต† เด’เดฐเต เด•เตเดฐเดฎเด‚ เดชเตเดฐเดฟเดจเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจ เด’เดฐเต เดซเต‹เตผ เดฒเต‚เดชเตเดชเต เด‰เดฃเตเดŸเต†เดจเตเดจเต เด•เดฐเตเดคเตเด•. เดตเดพเด—เตเดฆเดพเดจเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต, เดจเดฟเด™เตเด™เตพ เดˆ เดฒเต‚เดชเตเดชเต เดฎเดพเดฑเตเดฑเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต, เด…เด™เตเด™เดจเต† เดธเด‚เด–เตเดฏเด•เตพ 0 เดฎเตเดคเตฝ 10 เดตเดฐเต†เดฏเตเดณเตเดณ เด•เตเดฐเดฎเดคเตเดคเดฟเตฝ เดชเตเดฐเดฟเดจเตเดฑเต เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเด‚. เด…เดคเดฟเดจเดพเตฝ, เด’เดฐเต เดชเต‚เดœเตเดฏเด‚ เดชเตเดฐเดฟเดจเตเดฑเต เดšเต†เดฏเตเดฏเดพเตป 6 เดธเต†เด•เตเด•เตปเดกเตเด‚ เด’เดฐเต†เดฃเตเดฃเด‚ เดชเตเดฐเดฟเดจเตเดฑเต เดšเต†เดฏเตเดฏเดพเตป 2 เดธเต†เด•เตเด•เตปเดกเตเด‚ เดŽเดŸเตเด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เด†เดฆเตเดฏเด‚ เดชเต‚เดœเตเดฏเด‚ เดชเตเดฐเดฟเดจเตเดฑเต เดšเต†เดฏเตเดฏเดฃเด‚, เดคเตเดŸเตผเดจเตเดจเต เด…เดšเตเดšเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด•เต—เดฃเตเดŸเตเดกเต—เตบ เด†เดฐเด‚เดญเดฟเด•เตเด•เตเด‚.

เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚, เดˆ เดชเตเดฐเดถเตเดจเด‚ เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เดพเตป เดžเด™เตเด™เตพ Async/Await เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ .sort เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ. เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃ เดชเดฐเดฟเดนเดพเดฐเด‚ เด…เดตเดธเดพเดจเด‚ เด†เดฃเต.

Async เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพ

ES2017 (ES8)-เดฒเต† เด…เดธเดฟเตปเด•เต เดซเด‚เด—เตโ€Œเดทเดจเตเด•เดณเตเดŸเต† เด•เต‚เดŸเตเดŸเดฟเดšเตเดšเต‡เตผเด•เตเด•เตฝ เดตเดพเด—เตเดฆเดพเดจเด™เตเด™เดณเตเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเดจเตเดณเตเดณ เดšเตเดฎเดคเดฒ เดฒเดณเดฟเดคเดฎเดพเด•เตเด•เดฟ. เด…เดธเดฟเตปเด•เต เดซเด‚เด—เตเดทเดจเตเด•เตพ เดตเดพเด—เตเดฆเดพเดจเด™เตเด™เดณเตเดŸเต† "เดฎเตเด•เดณเดฟเตฝ" เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเต เดžเดพเตป เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเดจเตเดจเต. เดˆ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพ เด—เตเดฃเดชเดฐเดฎเดพเดฏเดฟ เดตเตเดฏเดคเตเดฏเดธเตเดคเดฎเดพเดฏ เด†เดถเดฏเด™เตเด™เดณเต† เดชเตเดฐเดคเดฟเดจเดฟเดงเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ. เดตเดพเด—เตเดฆเดพเดจเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เด•เต‹เดกเดฟเดจเต เดชเด•เดฐเดฎเดพเดฏเดฟ เด‰เดฆเตเดฆเต‡เดถเดฟเดšเตเดšเดฟเดŸเตเดŸเตเดณเตเดณเดคเดพเดฃเต เด…เดธเดฟเตปเด•เต เดซเด‚เด—เตโ€Œเดทเดจเตเด•เตพ.

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 function fn() {
  return 'hello';
}
fn().then(console.log)
// hello

เดชเตเดฐเดคเตเดฏเต‡เด•เดฎเดพเดฏเดฟ, fn เดธเตเดŸเตเดฐเดฟเด‚เด—เต เดนเดฒเต‹ เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เตเดจเตเดจเต. เดถเดฐเดฟ, เด‡เดคเตŠเดฐเต เด…เดธเดฟเตปเด•เตเดฐเดฃเดธเต เดซเด‚เด—เตโ€Œเดทเตป เด†เดฏเดคเดฟเดจเดพเตฝ, เดธเตเดŸเตเดฐเดฟเด‚เด—เต เดฎเต‚เดฒเตเดฏเด‚ เด’เดฐเต เด•เตบเดธเตโ€ŒเดŸเตเดฐเด•เตโ€ŒเดŸเตผ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดตเดพเด—เตเดฆเดพเดจเดคเตเดคเดฟเตฝ เดชเตŠเดคเดฟเดžเตเดžเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต.

Async เด‡เดฒเตเดฒเดพเดคเต† เด’เดฐเต เด‡เดคเดฐ เดกเดฟเดธเตˆเตป เด‡เดคเดพ:

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.resolve เดŽเดจเตเดจเดคเดฟเดจเต เดชเด•เดฐเด‚ เด’เดฐเต เดชเดฟเดถเด•เต เด…เดŸเด™เตเด™เดฟเดฏ Promise.reject เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เตเด‚.

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 = เด•เดพเดคเตเดคเดฟเดฐเดฟเด•เตเด•เตเด• 9 เตฝ เดจเดฟเดจเตเดจเต เดชเดฐเดฟเดตเตผเดคเตเดคเดจเด‚ เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเต; const a = เด•เดพเดคเตเดคเดฟเดฐเดฟเด•เตเด•เตเด• Promise.resolve(9);.
  • Await เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเดคเดฟเดจเต เดถเต‡เดทเด‚, a เด…เดคเดฟเดจเตเดฑเต† เดฎเต‚เดฒเตเดฏเด‚ เดฒเดญเดฟเด•เตเด•เตเดจเตเดจเดคเตเดตเดฐเต† เดซเด‚เด—เตโ€Œเดทเตป เดŽเด•เตโ€Œเดธเดฟเด•เตเดฏเต‚เดทเตป เดคเดพเตฝเด•เตเด•เดพเดฒเดฟเด•เดฎเดพเดฏเดฟ เดจเดฟเตผเดคเตเดคเดฟเดตเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต (เดจเดฟเดฒเดตเดฟเดฒเต† เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ เด‡เดคเต 9 เด†เดฃเต).
  • delayAndGetRandom(1000) fn เดซเด‚เด—เตโ€Œเดทเตป เดธเตเดตเดฏเด‚ เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเด•เตเดจเตเดจเดคเตเดตเดฐเต† (1 เดธเต†เด•เตเด•เตปเดกเดฟเดจเตเดถเต‡เดทเด‚) เด…เดคเดฟเดจเตเดฑเต† เดจเดฟเตผเดตเตเดตเดนเดฃเด‚ เดคเดพเตฝเด•เตเด•เดพเดฒเดฟเด•เดฎเดพเดฏเดฟ เดจเดฟเตผเดคเตเดคเตเดจเตเดจเต. เด‡เดคเต 1 เดธเต†เด•เตเด•เตปเดกเต เดจเต‡เดฐเดคเตเดคเต‡เด•เตเด•เต fn เดซเด‚เด—เตโ€Œเดทเตป เดซเดฒเดชเตเดฐเดฆเดฎเดพเดฏเดฟ เดจเดฟเตผเดคเตเดคเตเดจเตเดจเต.
  • delayAndGetRandom(1000) เดฑเดฟเดธเต‹เตพเดตเต เดตเดดเดฟ เด’เดฐเต เดฑเดพเตปเดกเด‚ เดฎเต‚เดฒเตเดฏเด‚ เดจเตฝเด•เตเดจเตเดจเต, เด…เดคเต b เดŽเดจเตเดจ เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเดฟเดฒเต‡เด•เตเด•เต เด…เดธเตˆเตป เดšเต†เดฏเตเดฏเตเดจเตเดจเต.
  • เดถเดฐเดฟ, เดตเต‡เดฐเดฟเดฏเดฌเดฟเตพ เดธเดฟเดฏเตเดŸเต† เด•เต‡เดธเต เดตเต‡เดฐเดฟเดฏเดฌเดฟเตพ เดŽเดฏเตเดŸเต† เด•เต‡เดธเดฟเดจเต เดธเดฎเดพเดจเดฎเดพเดฃเต. เด…เดคเดฟเดจเตเดถเต‡เดทเด‚, เดŽเดฒเตเดฒเดพเด‚ เด’เดฐเต เดจเดฟเดฎเดฟเดทเดคเตเดคเต‡เด•เตเด•เต เดจเดฟเตผเดคเตเดคเตเดจเตเดจเต, เดŽเดจเตเดจเดพเตฝ เด‡เดชเตเดชเต‹เตพ delayAndGetRandom(1000) เด†เดตเดถเตเดฏเดฎเดฟเดฒเตเดฒเดพเดคเตเดคเดคเดฟเดจเดพเตฝ เด’เดจเตเดจเตเด‚ เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เตเดจเตเดจเดฟเดฒเตเดฒ.
  • เดคเตฝเดซเดฒเดฎเดพเดฏเดฟ, a + b * c เดซเต‹เตผเดฎเตเดฒ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฎเต‚เดฒเตเดฏเด™เตเด™เตพ เด•เดฃเด•เตเด•เดพเด•เตเด•เตเดจเตเดจเต. เดซเดฒเด‚ Promise.resolve เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดตเดพเด—เตเดฆเดพเดจเดคเตเดคเดฟเตฝ เดชเตŠเดคเดฟเดžเตเดžเต เดซเด‚เด—เตโ€Œเดทเตป เดตเดดเดฟ เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เตเดจเตเดจเต.

เดˆ เดตเดฟเดฐเดพเดฎเด™เตเด™เตพ ES6-เดฒเต† เดœเดจเดฑเต‡เดฑเตเดฑเดฑเตเด•เดณเต† เด…เดจเตเดธเตเดฎเดฐเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดพเดฏเดฟเดฐเดฟเด•เตเด•เดพเด‚, เดชเด•เตเดทเต‡ เด…เดคเดฟเตฝ เดšเดฟเดฒเดคเตเดฃเตเดŸเต เดจเดฟเด™เตเด™เดณเตเดŸเต† เด•เดพเดฐเดฃเด™เตเด™เตพ.

เดชเตเดฐเดถเตเดจเด‚ เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เตเดจเตเดจเต

เดถเดฐเดฟ, เด‡เดชเตเดชเต‹เตพ เดฎเตเด•เดณเดฟเตฝ เดชเดฑเดžเตเดž เดชเตเดฐเดถเตเดจเดคเตเดคเดฟเดจเตเดณเตเดณ เดชเดฐเดฟเดนเดพเดฐเด‚ เดจเต‹เด•เตเด•เดพเด‚.

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 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 เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเตเดฎเต†เดจเตเดจเต เดชเตเดฐเดคเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเตฝ, เด…เดคเดฟเดจเตเดฑเต† เดชเดฐเดพเดœเดฏเด‚ เด•เตเดฏเดพเดšเตเดšเต เดฌเตเดฒเต‹เด•เตเด•เดฟเดจเตเดฑเต† เดจเดฟเตผเดตเตเดตเดนเดฃเดคเตเดคเดฟเดจเต เด•เดพเดฐเดฃเดฎเดพเด•เตเด‚. เดคเตฝเดซเดฒเดฎเดพเดฏเดฟ, เดซเด‚เด—เตโ€Œเดทเตป เดซเต‚ เดจเดฟเตผเดตเดšเดฟเด•เตเด•เดพเดคเต† (เดŸเตเดฐเตˆ เดฌเตเดฒเต‹เด•เตเด•เดฟเตฝ เด’เดจเตเดจเตเด‚ เดคเดฟเดฐเดฟเด•เต† เดฒเดญเดฟเด•เตเด•เดพเดคเตเดคเดชเตเดชเต‹เตพ) เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด’เดฐเต เดชเดฟเดถเด•เต เดชเดฟเดŸเดฟเดชเต†เดŸเตเดŸเต เด…เดตเดธเดพเดจเดฟเด•เตเด•เตเด‚. เดคเตฝเดซเดฒเดฎเดพเดฏเดฟ, เดˆ เดซเด‚เด—เตโ€Œเดทเตป เดชเดฐเดพเดœเดฏเดชเตเดชเต†เดŸเดฟเดฒเตเดฒ, เด•เดพเดฐเดฃเด‚ try/catch เดซเด‚เด—เตเดทเตป foo เดคเดจเตเดจเต† เด•เตˆเด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเตเด‚.

เดฎเดฑเตเดฑเตŠเดฐเต เด‰เดฆเดพเดนเดฐเดฃเด‚ เด‡เดคเดพ:

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

เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเตฝ, canRejectOrReturn foo-เตฝ เดจเดฟเดจเตเดจเต เดฎเดŸเด™เตเด™เดฟเดฏเต†เดจเตเดจ เดตเดธเตเดคเตเดค เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเดพเดฃเต. เดˆ เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ เดซเต‚, เด’เดจเตเดจเตเด•เดฟเตฝ เด’เดฐเต เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏ เดธเด‚เด–เตเดฏเดฏเดฟเตฝ เด…เดตเดธเดพเดจเดฟเด•เตเด•เตเดจเตเดจเต เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด’เดฐเต เดชเดฟเดถเด•เต เดจเตฝเด•เตเดจเตเดจเต ("เด•เตเดทเดฎเดฟเด•เตเด•เดฃเด‚, เดจเดฎเตเดชเตผ เดตเดณเดฐเต† เดตเดฒเตเดคเดพเดฃเต"). เด•เตเดฏเดพเดšเตเดšเต เดฌเตเดฒเต‹เด•เตเด•เต เด’เดฐเดฟเด•เตเด•เดฒเตเด‚ เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเดฟเดฒเตเดฒ.

canRejectOrReturn เดŽเดจเตเดจเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดชเดพเดธเตเดธเดพเด•เตเด•เดฟเดฏ เดตเดพเด—เตเดฆเดพเดจเด‚ foo เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เตเดจเตเดจเต เดŽเดจเตเดจเดคเดพเดฃเต เดชเตเดฐเดถเตเดจเด‚. เด…เดคเดฟเดจเดพเตฝ foo เดŽเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดชเดฐเดฟเดนเดพเดฐเด‚ canRejectOrReturn เดŽเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดชเดฐเดฟเดนเดพเดฐเดฎเดพเดฏเดฟ เดฎเดพเดฑเตเดจเตเดจเต. เดˆ เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ, เด•เต‹เดกเดฟเตฝ เดฐเดฃเตเดŸเต เดตเดฐเดฟเด•เตพ เดฎเดพเดคเตเดฐเดฎเต‡ เด‰เดฃเตเดŸเดพเด•เต‚:

try {
    const promise = canRejectOrReturn();
    return promise;
}

เดจเดฟเด™เตเด™เตพ เด•เดพเดคเตเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเตเด‚ เดฎเดŸเด™เตเด™เตเดจเตเดจเดคเตเด‚ เด’เดฐเตเดฎเดฟเดšเตเดšเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ เดธเด‚เดญเดตเดฟเด•เตเด•เตเดจเตเดจเดคเต เด‡เดคเดพ:

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

เดฎเตเด•เดณเดฟเดฒเต† เด•เต‹เดกเดฟเตฝ, เด’เดฐเต เดชเต†เตผเดซเต†เด•เตเดฑเตเดฑเต เดจเดฎเตเดชเดฑเตเด‚ เด’เดฐเต เดชเดฟเดถเด•เตเด‚ เดชเดฟเดŸเดฟเดชเต†เดŸเตเดŸเต foo เดตเดฟเดœเดฏเด•เดฐเดฎเดพเดฏเดฟ เดชเตเดฑเดคเตเดคเตเด•เดŸเด•เตเด•เตเด‚. เด‡เดตเดฟเดŸเต† เดจเดฟเดฐเดพเด•เดฐเดฃเด™เตเด™เตพ เด‰เดฃเตเดŸเดพเด•เดฟเดฒเตเดฒ. เดชเด•เตเดทเต‡, เดจเดฟเตผเดตเดšเดฟเด•เตเด•เดพเดคเต†, canRejectOrReturn เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต foo เดฎเดŸเด™เตเด™เตเด‚. เดฑเดฟเดŸเตเดŸเต‡เตบ เดตเต†เดฏเตเดฑเตเดฑเต 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-เตฝ เด•เต‹เตพเดฌเดพเด•เตเด•เตเด•เดณเดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดฑเตเดฃเตเดŸเต. GitHub-เดฒเต† เด“เดชเตเดชเตบ เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚ เดจเตฝเด•เตเดจเตเดจ fetchPublicReposCount(เด‰เดชเดฏเต‹เด•เตเดคเตƒเดจเดพเดฎเด‚) เดซเด‚เด—เตโ€Œเดทเตป เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเดฎเดพเดฃเต. เดฎเต‚เดจเตเดจเต เด‰เดชเดฏเต‹เด•เตเดคเดพเด•เตเด•เตพ เด‰เดฃเตเดŸเต†เดจเตเดจเต เดชเดฑเดฏเดŸเตเดŸเต†, เด…เดตเดฐเตเดŸเต† เด…เดณเดตเตเด•เตพ เดจเดฎเตเด•เตเด•เต เด†เดตเดถเตเดฏเดฎเดพเดฃเต. เดˆ เดŸเดพเดธเตเด•เตเด•เดฟเดจเตเดณเตเดณ เด•เต‹เดกเต เด‡เดคเดพ:

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

.เดฎเดพเดชเตเดชเต เด•เต‹เตพเดฌเดพเด•เตเด•เดฟเตฝ เด•เดพเดคเตเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเดพเดฃเต. เด‡เดตเดฟเดŸเต† เด•เต—เดฃเตเดŸเตเด•เตพ เดŽเดจเตเดจเดคเต เดตเดพเด—เตเดฆเดพเดจเด™เตเด™เดณเตเดŸเต† เด’เดฐเต เดจเดฟเดฐเดฏเดพเดฃเต, เด•เต‚เดŸเดพเดคเต† .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 เดตเดพเด—เตโ€Œเดฆเดพเดจเด™เตเด™เดณเตเดŸเต† เด’เดฐเต เดจเดฟเดฐ เด‡เตปเดชเตเดŸเตเดŸเดพเดฏเดฟ เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด’เดฐเต เดตเดพเด—เตโ€Œเดฆเดพเดจเด‚ เดจเตฝเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต‡เดคเต, เด…เดฑเต‡เดฏเดฟเดฒเต† เดŽเดฒเตเดฒเดพ เดตเดพเด—เตเดฆเดพเดจเด™เตเด™เดณเตเด‚ เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเด•เตเด•เดฟเดฏ เดถเต‡เดทเด‚ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด†เดฆเตเดฏ เดจเดฟเดฐเดธเดฟเด•เตเด•เตฝ เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเดฏเดฟ. เด…เดตเดฏเต†เดฒเตเดฒเดพเด‚ เด’เดฐเต‡ เดธเดฎเดฏเด‚ เด†เดฐเด‚เดญเดฟเด•เตเด•เดพเดคเตเดคเดคเต เดธเด‚เดญเดตเดฟเด•เตเด•เดพเด‚ - เด’เดฐเต‡เดธเดฎเดฏเด‚ เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเดคเต เด‰เดฑเดชเตเดชเดพเด•เตเด•เดพเตป, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดชเดฟ-เดฎเดพเดชเตเดชเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚.

เดคเต€เดฐเตเดฎเดพเดจเด‚

เดตเดฟเด•เดธเดจเดคเตเดคเดฟเดจเต เด…เดธเดฟเตปเด•เต เดซเด‚เด—เตโ€Œเดทเดจเตเด•เตพ เด•เต‚เดŸเตเดคเตฝ เดชเตเดฐเดพเดงเดพเดจเตเดฏเดฎเตผเดนเดฟเด•เตเด•เตเดจเตเดจเต. เดถเดฐเดฟ, เด…เดธเดฟเตปเด•เต เดซเด‚เด—เตโ€Œเดทเดจเตเด•เดณเตเดŸเต† เด…เดกเดพเดชเตเดฑเตเดฑเต€เดตเต เด‰เดชเดฏเต‹เด—เดคเตเดคเดฟเดจเต, เดจเดฟเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดฃเด‚ เด…เดธเดฟเตปเด•เต เด‡เดฑเตเดฑเดฑเต‡เดฑเตเดฑเดฑเตเด•เตพ. เด’เดฐเต เดœเดพเดตเดพเดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดกเต†เดตเดฒเดชเตเดชเตผ เด‡เดคเดฟเตฝ เดจเดจเตเดจเดพเดฏเดฟ เด…เดฑเดฟเดžเตเดžเดฟเดฐเดฟเด•เตเด•เดฃเด‚.

เดธเตเด•เดฟเตฝเดฌเต‹เด•เตเดธเต เดถเตเดชเดพเตผเดถ เดšเต†เดฏเตเดฏเตเดจเตเดจเต:

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•