เปƒเบซเป‰เป€เบšเบดเปˆเบ‡ Async/Await เปƒเบ™ JavaScript เป‚เบ”เบเปƒเบŠเป‰เบ•เบปเบงเบขเปˆเบฒเบ‡

เบœเบนเป‰เบ‚เบฝเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบเบงเบ”เป€เบšเบดเปˆเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡ Async/Await เปƒเบ™ JavaScript. เป‚เบ”เบเบฅเบงเบกเปเบฅเป‰เบง, Async/Await เป€เบ›เบฑเบ™เบงเบดเบ—เบตเบ—เบตเปˆเบชเบฐเบ”เบงเบเปƒเบ™เบเบฒเบ™เบ‚เบฝเบ™เบฅเบฐเบซเบฑเบ” asynchronous. เบเปˆเบญเบ™เบ—เบตเปˆเบฅเบฑเบเบชเบฐเบ™เบฐเบ™เบตเป‰เบ›เบฒเบเบปเบ”, เบฅเบฐเบซเบฑเบ”เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบ–เบทเบเบ‚เบฝเบ™เป‚เบ”เบเปƒเบŠเป‰เบเบฒเบ™เป‚เบ—เบเบฑเบšเปเบฅเบฐเบ„เปเบฒเบชเบฑเบ™เบเบฒ. เบœเบนเป‰เบ‚เบฝเบ™เบ‚เบญเบ‡เบšเบปเบ”เบ„เบงเบฒเบกเบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบšเป€เบ›เบตเบ”เป€เบœเบตเบเบ‚เปเป‰เบ”เบตเบ‚เบญเบ‡ Async / Await เป‚เบ”เบเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ•เบปเบงเบขเปˆเบฒเบ‡เบ•เปˆเบฒเบ‡เป†.

เบžเบงเบเป€เบฎเบปเบฒเป€เบ•เบทเบญเบ™: เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เบญเปˆเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡ "Habr" - เบชเปˆเบงเบ™เบซเบผเบธเบ” 10 rubles เป€เบกเบทเปˆเบญเบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เปƒเบ™เบซเบผเบฑเบเบชเบนเบ” Skillbox เป‚เบ”เบเปƒเบŠเป‰เบฅเบฐเบซเบฑเบ”เบชเบปเปˆเบ‡เป€เบชเบตเบก "Habr".

Skillbox เปเบ™เบฐเบ™เปเบฒ: เบซเบผเบฑเบเบชเบนเบ”เบเบฒเบ™เบชเบถเบเบชเบฒเบญเบญเบ™เป„เบฅเบ™เปŒ "เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ Java".

เป‚เบ—

เป‚เบ—เบเบฑเบšเปเบกเปˆเบ™เบŸเบฑเบ‡เบŠเบฑเบ™เบ—เบตเปˆเบเบฒเบ™เป‚เบ—เบ–เบทเบเบŠเบฑเบเบŠเป‰เบฒเบขเปˆเบฒเบ‡เบšเปเปˆเบกเบตเบเบณเบ™เบปเบ”. เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰, callbacks เป„เบ”เป‰เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เบžเบทเป‰เบ™เบ—เบตเปˆเบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบšเปเปˆเบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบšเบ—เบฑเบ™เบ—เบต.

เบ™เบตเป‰เปเบกเปˆเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡ asynchronously เบญเปˆเบฒเบ™เป„เบŸเบฅเปŒเปƒเบ™ 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, เบŠเบตเป‰เบšเบญเบเบงเบฑเบ™เบ—เบต.

เบกเบฑเบ™เป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบˆเบฐเป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆเบเบฑเบšเบเบฒเบ™เบŠเป‰เบญเบ™เบเบฑเบ™เบ‚เบญเบ‡ callbacks เปเบฅเบฐเบˆเปเบฒเบ™เบงเบ™เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเบ‚เบญเบ‡ }) เปƒเบ™เบชเปˆเบงเบ™เบชเบธเบ”เบ—เป‰เบฒเบเบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”. เบกเบฑเบ™เบ–เบทเบเป€เบญเบตเป‰เบ™เบงเปˆเบฒ Callback Hell เบซเบผเบท Pyramid of Doom.

เบ‚เปเป‰เป€เบชเบเบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เปเบกเปˆเบ™เป€เบซเบฑเบ™เป„เบ”เป‰เบŠเบฑเบ”เป€เบˆเบ™:

  • เบฅเบฐเบซเบฑเบ”เบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบเบ—เบตเปˆเบˆเบฐเบญเปˆเบฒเบ™.
  • เบกเบฑเบ™เบเบฑเบ‡เบกเบตเบ„เบงเบฒเบกเบซเบเบธเป‰เบ‡เบเบฒเบเปƒเบ™เบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”, เป€เบŠเบดเปˆเบ‡เบกเบฑเบเบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบšเปเปˆเบ”เบต.

เป€เบžเบทเปˆเบญเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ™เบตเป‰, เบ„เปเบฒเบชเบฑเบ™เบเบฒเป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบกเป€เบ‚เบปเป‰เบฒเปƒเบ™ JavaScript. เบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เป€เบžเบทเปˆเบญเบ—เบปเบ”เปเบ—เบ™เบเบฒเบ™เบฎเบฑเบ‡เป€เบฅเบดเบเบ‚เบญเบ‡ callbacks เบเบฑเบšเบ„เปเบฒเบงเปˆเบฒ .เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™.

เบฅเบฑเบเบชเบฐเบ™เบฐเปƒเบ™เบ—เบฒเบ‡เบšเบงเบเบ‚เบญเบ‡เบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒเปเบกเปˆเบ™เบงเปˆเบฒเบžเบงเบเป€เบ‚เบปเบฒเป€เบฎเบฑเบ”เปƒเบซเป‰เบฅเบฐเบซเบฑเบ”เบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เป„เบ”เป‰เบ”เบตเบ‚เบถเป‰เบ™เบซเบผเบฒเบ, เบˆเบฒเบเป€เบ—เบดเบ‡เบฅเบปเบ‡เบฅเบธเปˆเบกเปเบ—เบ™เบ—เบตเปˆเบˆเบฐเบˆเบฒเบเบŠเป‰เบฒเบเป„เบ›เบ‚เบงเบฒ. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบ„เปเบฒเบชเบฑเบ™เบเบฒเบเบฑเบ‡เบกเบตเบšเบฑเบ™เบซเบฒเบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ:

  • เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบžเบตเปˆเบกเบซเบผเบฒเบ .เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™.
  • เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเบฅเบญเบ‡/เบˆเบฑเบš, .catch เปเบกเปˆเบ™เปƒเบŠเป‰เป€เบžเบทเปˆเบญเบˆเบฑเบ”เบเบฒเบ™เบเบฑเบšเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ—เบฑเบ‡เปเบปเบ”.
  • เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบซเบผเบฒเบเบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒเบžเบฒเบเปƒเบ™เบซเบ™เบถเปˆเบ‡ loop เปเบกเปˆเบ™เบšเปเปˆเบชเบฐเบ”เบงเบเบชเบฐเป€เบซเบกเบต;

เบ™เบตเป‰เปเบกเปˆเบ™เบšเบฑเบ™เบซเบฒเบ—เบตเปˆเบˆเบฐเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เป€เบ–เบดเบ‡เบ„เบงเบฒเบกเบซเบกเบฒเบเบ‚เบญเบ‡เบˆเบธเบ”เบชเบธเบ”เบ—เป‰เบฒเบ.

เบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบกเบต for loop เบ—เบตเปˆเบžเบดเบกเบฅเปเบฒเบ”เบฑเบšเบ‚เบญเบ‡เบ•เบปเบงเป€เบฅเบเบˆเบฒเบ 0 เบซเบฒ 10 เปƒเบ™เบŠเปˆเบงเบ‡เป€เบงเบฅเบฒเบชเบธเปˆเบก (0โ€“n เบงเบดเบ™เบฒเบ—เบต). เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒ, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ›เปˆเบฝเบ™ loop เบ™เบตเป‰เป€เบžเบทเปˆเบญเปƒเบซเป‰เบ•เบปเบงเป€เบฅเบเบ–เบทเบเบžเบดเบกเบ•เบฒเบกเบฅเปเบฒเบ”เบฑเบšเบˆเบฒเบ 0 เบซเบฒ 10. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ–เป‰เบฒเบกเบฑเบ™เปƒเบŠเป‰เป€เบงเบฅเบฒ 6 เบงเบดเบ™เบฒเบ—เบตเป€เบžเบทเปˆเบญเบžเบดเบกเบชเบนเบ™เปเบฅเบฐ 2 เบงเบดเบ™เบฒเบ—เบตเป€เบžเบทเปˆเบญเบžเบดเบกเบซเบ™เบถเปˆเบ‡, เบชเบนเบ™เบ„เบงเบ™เบˆเบฐเบžเบดเบกเบเปˆเบญเบ™, เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™. เบเบฒเบ™เบ™เบฑเบšเบ–เบญเบเบซเบผเบฑเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบžเบดเบกเบซเบ™เบถเปˆเบ‡เบˆเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™.

เปเบฅเบฐเปเบ™เปˆเบ™เบญเบ™, เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเป„เบ”เป‰เปƒเบŠเป‰ Async/Await เบซเบผเบท .sort เป€เบžเบทเปˆเบญเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ™เบตเป‰. เบเบฒเบ™เปเบเป‰เป„เบ‚เบ•เบปเบงเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™เบ•เบญเบ™เบ—เป‰เบฒเบเบ‚เบญเบ‡.

เบŸเบฑเบ‡เบŠเบฑเบ™ Async

เบเบฒเบ™เป€เบžเบตเปˆเบกเบŸเบฑเบ‡เบŠเบฑเบ™ async เปƒเบ™ ES2017 (ES8) เป€เบฎเบฑเบ”เปƒเบซเป‰เบงเบฝเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบชเบฑเบ™เบเบฒเบ‡เปˆเบฒเบเบ‚เบถเป‰เบ™. เบ‚เป‰เบญเบเบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบŸเบฑเบ‡เบŠเบฑเบ™ async เป€เบฎเบฑเบ”เบงเบฝเบ "เบขเบนเปˆเป€เบ—เบดเบ‡" เบ‚เบญเบ‡เบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒ. เบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบšเปเปˆเป„เบ”เป‰เบชเบฐเปเบ”เบ‡เป€เบ–เบดเบ‡เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบ—เบฒเบ‡เบ”เป‰เบฒเบ™เบ„เบธเบ™เบ™เบฐเบžเบฒเบš. เบŸเบฑเบ‡เบŠเบฑเบ™ Async เบกเบตเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เป€เบ›เบฑเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบชเปเบฒเบฅเบฑเบšเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเปƒเบŠเป‰เบ„เปเบฒเบชเบฑเบ™เบเบฒ.

Async/Await เป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบˆเบฑเบ”เบฅเบฐเบšเบฝเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบฅเบฐเบซเบฑเบ” asynchronous เปƒเบ™เบฎเบนเบšเปเบšเบš synchronous.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบเบฒเบ™เบฎเบนเป‰เบ„เปเบฒเบชเบฑเบ™เบเบฒเป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เบ‡เปˆเบฒเบเบ•เปเปˆเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเปƒเบˆเบซเบผเบฑเบเบเบฒเบ™เบ‚เบญเบ‡ Async/Await.

syntax

เป‚เบ”เบเบ›เบปเบเบเบฐเบ•เบดเบกเบฑเบ™เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบชเบญเบ‡เบ„เปเบฒเบชเปเบฒเบ„เบฑเบ™: async เปเบฅเบฐเบฅเปเบ–เป‰เบฒ. เบ„เปเบฒเบ—เปเบฒเบญเบดเบ”เบ›เปˆเบฝเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบ›เบฑเบ™ asynchronous. เบซเบ™เป‰เบฒเบ—เบตเปˆเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ™เปเบฒเปƒเบŠเป‰เบฅเปเบ–เป‰เบฒ. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบญเบทเปˆเบ™เป†, เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™เบ™เบตเป‰เบˆเบฐเบชเป‰เบฒเบ‡เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”.

// 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! เบกเบฑเบ™เป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบˆเบทเปˆเป„เบงเป‰เบงเปˆเบฒเบ•เบปเบงเบชเป‰เบฒเบ‡เบŠเบฑเป‰เบ™เบฎเบฝเบ™เปเบฅเบฐ getters / setters เบšเปเปˆเบชเบฒเบกเบฒเบ”เบšเปเปˆเบŠเบดเป‰เบ‡.

Semantics เปเบฅเบฐเบเบปเบ”เบฅเบฐเบšเบฝเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”

เบŸเบฑเบ‡เบŠเบฑเบ™ Async เป‚เบ”เบเบžเบทเป‰เบ™เบ–เบฒเบ™เปเบฅเป‰เบงเปเบกเปˆเบ™เบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบเบฑเบšเบŸเบฑเบ‡เบŠเบฑเบ™ JS เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™, เปเบ•เปˆเบกเบตเบ‚เปเป‰เบเบปเบเป€เบงเบฑเป‰เบ™.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบŸเบฑเบ‡เบŠเบฑเบ™ async เบชเบฐเป€เบซเบกเบตเบเบฑเบšเบ„เบทเบ™เบ„เปเบฒเบชเบฑเบ™เบเบฒ:

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

เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐ, fn เบชเบปเปˆเบ‡เบ„เบทเบ™เบชเบฐเบ•เบฃเบดเบ‡เบชเบฐเบšเบฒเบเบ”เบต. เบ”เบต, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบŸเบฑเบ‡เบŠเบฑเบ™ asynchronous, เบ„เปˆเบฒเบชเบฐเบ•เบฃเบดเบ‡เบ–เบทเบเบซเปเปˆเบ”เป‰เบงเบเบชเบฑเบ™เบเบฒเป‚เบ”เบเปƒเบŠเป‰เบ•เบปเบงเบชเป‰เบฒเบ‡.

เบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เบญเบญเบเปเบšเบšเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบšเปเปˆเบกเบต Async:

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

เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบ„เปเบฒเบชเบฑเบ™เบเบฒเบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™ "เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡". เบŸเบฑเบ‡เบŠเบฑเบ™เบญเบฐเบŠเบดเบ‡เป‚เบ„เบ™เปเบกเปˆเบ™เบ–เบทเบเบซเปเปˆเป„เบงเป‰เปƒเบ™เบชเบฑเบ™เบเบฒเปƒเปเปˆเบชเบฐเป€เปเบต.

เบ–เป‰เบฒเบ„เปˆเบฒเบเบฑเบšเบ„เบทเบ™เปเบกเปˆเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™, เบŸเบฑเบ‡เบŠเบฑเบ™ async เบ•เบญเบšเบ„เปˆเบฒเป‚เบ”เบเบเบฒเบ™เบซเปเปˆเบกเบฑเบ™เป„เบงเป‰เปƒเบ™เบชเบฑเบ™เบเบฒ. เบ–เป‰เบฒเบ„เปˆเบฒเบเบฑเบšเบ„เบทเบ™เปเบกเปˆเบ™เบงเบฑเบ”เบ–เบธเบชเบฑเบ™เบเบฒ, เบเบฒเบ™เปเบเป‰เป„เบ‚เบ‚เบญเบ‡เบกเบฑเบ™เบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™เปƒเบ™เบ„เปเบฒเบชเบฑเบ™เบเบฒเปƒเบซเบกเปˆ.

const p = Promise.resolve('hello')
p instanceof Promise;
// true
 
Promise.resolve(p) === p;
// true
 

เปเบ•เปˆเบˆเบฐเป€เบเบตเบ”เบซเบเบฑเบ‡เบ‚เบถเป‰เบ™เบ–เป‰เบฒเบกเบตเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เบžเบฒเบเปƒเบ™เบŸเบฑเบ‡เบŠเบฑเบ™เบšเปเปˆเบŠเบดเป‰เบ‡?

async function foo() {
  throw Error('bar');
}
 
foo().catch(console.log);

เบ–เป‰เบฒเบกเบฑเบ™เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบ›เบธเบ‡เปเบ•เปˆเบ‡, foo() เบˆเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™เบ„เปเบฒเบชเบฑเบ™เบเบฒเบ”เป‰เบงเบเบเบฒเบ™เบ›เบฐเบ•เบดเป€เบชเบ”. เปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ™เบตเป‰, Promise.reject เบ—เบตเปˆเบกเบตเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™เปเบ—เบ™ Promise.resolve.

เบŸเบฑเบ‡เบŠเบฑเบ™ Async เบชเบฐเป€เบซเบกเบตเปƒเบซเป‰เบ„เปเบฒเบชเบฑเบ™เบเบฒ, เป‚เบ”เบเบšเปเปˆเบ„เปเบฒเบ™เบถเบ‡เป€เบ–เบดเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™.

เบŸเบฑเบ‡เบŠเบฑเบ™ Asynchronous เบขเบธเบ”เบŠเบปเปˆเบงเบ„เบฒเบงเปƒเบ™เบ—เบธเบเป†เบเบฒเบ™เบฅเปเบ–เป‰เบฒ .

Awai เบกเบตเบœเบปเบ™เบเบฐเบ—เบปเบšเบ•เปเปˆเบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบ. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ–เป‰เบฒเบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบเป€เบ›เบฑเบ™เบ„เปเบฒเบชเบฑเบ™เบเบฒ, เบซเบ™เป‰เบฒเบ—เบตเปˆ 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; in const a = เบฅเปเบ„เบญเบ Promise.resolve(9);.
  • เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Await, เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบซเบ™เป‰เบฒเบ—เบตเปˆเบˆเบฐเบ–เบทเบเบฅเบฐเบ‡เบฑเบšเบˆเบปเบ™เบเปˆเบงเบฒ a เป„เบ”เป‰เบฎเบฑเบšเบกเบนเบ™เบ„เปˆเบฒเบ‚เบญเบ‡เบกเบฑเบ™ (เปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™เบกเบฑเบ™เปเบกเปˆเบ™ 9).
  • delayAndGetRandom(1000) เบขเบธเบ”เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบŸเบฑเบ‡เบŠเบฑเบ™ fn เป„เบงเป‰เบŠเบปเปˆเบงเบ„เบฒเบงเบˆเบปเบ™เบเบงเปˆเบฒเบกเบฑเบ™เบˆเบฐเบชเบณเป€เบฅเบฑเบ”เป€เบญเบ‡ (เบซเบผเบฑเบ‡เบˆเบฒเบ 1 เบงเบดเบ™เบฒเบ—เบต). เบญเบฑเบ™เบ™เบตเป‰เบขเบธเบ”เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡ fn เบขเปˆเบฒเบ‡เบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเป€เบ›เบฑเบ™เป€เบงเบฅเบฒ 1 เบงเบดเบ™เบฒเบ—เบต.
  • delayAndGetRandom(1000) เบœเปˆเบฒเบ™เบเบฒเบ™เปเบเป‰เป„เบ‚เบชเบปเปˆเบ‡เบ„เบทเบ™เบ„เปˆเบฒเบชเบธเปˆเบก, เป€เบŠเบดเปˆเบ‡เบ–เบทเบเบกเบญเบšเปเบฒเบเปƒเบซเป‰เบเบฑเบšเบ•เบปเบงเปเบ› b.
  • เบ”เบต, เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบกเบตเบ•เบปเบงเปเบ› c เปเบกเปˆเบ™เบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบเบฑเบšเบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบกเบตเบ•เบปเบงเปเบ› a. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบขเบธเบ”เป€เบŠเบปเบฒเบชเปเบฒเบฅเบฑเบšเบงเบดเบ™เบฒเบ—เบต, เปเบ•เปˆเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™ delayAndGetRandom (1000) เบเบฑเบšเบ„เบทเบ™เบกเบฒเบšเปเปˆเบกเบตเบซเบเบฑเบ‡เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบกเบฑเบ™เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™.
  • เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ„เปˆเบฒเบ•เปˆเบฒเบ‡เป†เป„เบ”เป‰เบ–เบทเบเบ„เบดเบ”เป„เบฅเปˆเป‚เบ”เบเปƒเบŠเป‰เบชเบนเบ” a + b * c. เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเปเบกเปˆเบ™เบซเปเปˆเบขเบนเปˆเปƒเบ™เบ„เปเบฒเบชเบฑเบ™เบเบฒเป‚เบ”เบเปƒเบŠเป‰ Promise.resolve เปเบฅเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™เป‚เบ”เบเบŸเบฑเบ‡เบŠเบฑเบ™.

เบเบฒเบ™เบขเบธเบ”เบŠเบปเปˆเบงเบ„เบฒเบงเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™เบเบฒเบ™เบฅเบฐเบ™เบถเบเป€เบ–เบดเบ‡เป€เบ„เบทเปˆเบญเบ‡เบเปเบฒเป€เบ™เบตเบ”เป„เบŸเบŸเป‰เบฒเปƒเบ™ ES6, เปเบ•เปˆเบกเบตเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบเปˆเบฝเบงเบเบฑเบšเบกเบฑเบ™ เป€เบซเบ”เบœเบปเบ™เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒ.

เบเบฒเบ™เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒ

เปเบฅเป‰เบง, เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบงเบดเบ—เบตเบเบฒเบ™เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ—เบตเปˆเป„เบ”เป‰เบเปˆเบฒเบงเบกเบฒเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡.

เบŸเบฑเบ‡เบŠเบฑเบ™ finishMyTask เปƒเบŠเป‰ Await เป€เบžเบทเปˆเบญเบฅเปเบ–เป‰เบฒเบœเบปเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™เป€เบŠเบฑเปˆเบ™: queryDatabase, sendEmail, logTaskInFile, เปเบฅเบฐเบญเบทเปˆเบ™เป†. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ›เบฝเบšเบ—เบฝเบšเบเบฒเบ™เปเบเป‰เป„เบ‚เบ™เบตเป‰เบเบฑเบšเบ„เปเบฒเบชเบฑเบ™เบเบฒเบ—เบตเปˆเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰, เบ„เบงเบฒเบกเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบˆเบฐเบเบฒเบเป€เบ›เบฑเบ™เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก, เบฎเบธเปˆเบ™ Async/Await เบŠเปˆเบงเบเปƒเบซเป‰เบ„เบงเบฒเบกเบŠเบฑเบšเบŠเป‰เบญเบ™ syntactic เบ—เบฑเบ‡เปเบปเบ”เบ‡เปˆเบฒเบเบ‚เบถเป‰เบ™. เปƒเบ™โ€‹เบเปโ€‹เบฅเบฐโ€‹เบ™เบตโ€‹เบ™เบตเป‰, เบšเปเปˆโ€‹เบกเบตโ€‹เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบ‚เบฐโ€‹เบซเบ™เบฒเบ”โ€‹เปƒเบซเบเปˆโ€‹เบ‚เบญเบ‡ callbacks เปเบฅเบฐโ€‹เบ•เปˆเบญเบ‡โ€‹เป‚เบชเป‰โ€‹เป€เบŠเบฑเปˆเบ™ .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 เบชเบฒเบกเบฒเบ”เปƒเบŠเป‰ try/catch เป€เบžเบทเปˆเบญเบˆเบฑเบ”เบเบฒเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เป„เบ”เป‰เป‚เบ”เบ synchronously.

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 เบŸเบฑเบ‡เบŠเบฑเบ™เบˆเบฐเบชเบดเป‰เบ™เบชเบธเบ”เบ”เป‰เบงเบ undefined (เป€เบกเบทเปˆเบญเบšเปเปˆเบกเบตเบซเบเบฑเบ‡เบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™เปƒเบ™ try block) เบซเบผเบทเบกเบตเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเบ–เบทเบเบˆเบฑเบš. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบŸเบฑเบ‡เบŠเบฑเบ™เบ™เบตเป‰เบˆเบฐเบšเปเปˆเบฅเบปเป‰เบกเป€เบซเบฅเบงเป€เบžเบฒเบฐเบงเปˆเบฒเบเบฒเบ™เบžเบฐเบเบฒเบเบฒเบก / เบˆเบฑเบšเบˆเบฐเบˆเบฑเบ”เบเบฒเบ™เบŸเบฑเบ‡เบŠเบฑเบ™ foo เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡.

เบ™เบตเป‰เปเบกเปˆเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบญเบทเปˆเบ™:

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

เบกเบฑเบ™เป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบˆเบฐเป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆเบเบฑเบšเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡, canRejectOrReturn เบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™เบˆเบฒเบ foo. Foo เปƒเบ™โ€‹เบเปโ€‹เบฅเบฐโ€‹เบ™เบตโ€‹เบ™เบตเป‰โ€‹เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบ—เบตเปˆโ€‹เบชเบปเบกโ€‹เบšเบนเบ™โ€‹เปเบšเบšโ€‹เบซเบผเบทโ€‹เบเบฑเบšโ€‹เบ„เบทเบ™โ€‹เบกเบฒโ€‹เบ„เบงเบฒเบกโ€‹เบœเบดเบ”โ€‹เบžเบฒเบ” (โ€œเบ‚เปโ€‹เบญเบฐโ€‹เป„เบž, เบ•เบปเบงโ€‹เป€เบฅเบโ€‹เปƒเบซเบเปˆโ€‹เป€เบเบตเบ™โ€‹เป„เบ›โ€). เบ•เบฑเบ™เบˆเบฑเบšเบˆเบฐเบšเปเปˆเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”.

เบšเบฑเบ™เบซเบฒเปเบกเปˆเบ™เบงเปˆเบฒ foo เบเบฑเบšเบ„เบทเบ™เบ„เปเบฒเบชเบฑเบ™เบเบฒเบ—เบตเปˆเบœเปˆเบฒเบ™เบˆเบฒเบ canRejectOrReturn. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบเบฒเบ™เปเบเป‰เป„เบ‚ foo เบเบฒเบเป€เบ›เบฑเบ™เบเบฒเบ™เปเบเป‰เป„เบ‚ canRejectOrReturn. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบฅเบฐเบซเบฑเบ”เบˆเบฐเบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบžเบฝเบ‡เปเบ•เปˆเบชเบญเบ‡เป€เบชเบฑเป‰เบ™:

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

เบ™เบตเป‰เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบเบตเบ”เบ‚เบทเป‰เบ™เบ–เป‰เบฒเบ—เปˆเบฒเบ™เปƒเบŠเป‰เบฅเปเบ–เป‰เบฒเปเบฅเบฐเบเบฑเบšเบ„เบทเบ™เบฎเปˆเบงเบกเบเบฑเบ™:

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

เปƒเบ™เบฅเบฐเบซเบฑเบ”เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡, foo เบˆเบฐเบญเบญเบเบขเปˆเบฒเบ‡เบชเปเบฒเป€เบฅเบฑเบ”เบœเบปเบ™เป‚เบ”เบเบกเบตเบ—เบฑเบ‡เบ•เบปเบงเป€เบฅเบเบ—เบตเปˆเบชเบปเบกเบšเบนเบ™เปเบšเบšเปเบฅเบฐเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเบ–เบทเบเบˆเบฑเบš. เบˆเบฐเบšเปเปˆเบกเบตเบเบฒเบ™เบ›เบฐเบ•เบดเป€เบชเบ”เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰. เปเบ•เปˆ foo เบˆเบฐเบเบฑเบšเบ„เบทเบ™เบกเบฒเบ”เป‰เบงเบ canRejectOrReturn, เบšเปเปˆเปเบกเปˆเบ™เป‚เบ”เบเบšเปเปˆเป„เบ”เป‰เบเปเบฒเบ™เบปเบ”. เปƒเบซเป‰เปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบ™เบตเป‰เป‚เบ”เบเบเบฒเบ™เบ–เบญเบ™เบเบฒเบ™เบเบฑเบšเบ„เบทเบ™เบ—เบตเปˆเบฅเปเบ–เป‰เบฒ canRejectOrReturn() line:

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

เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ—เบปเปˆเบงเป„เบ› เปเบฅเบฐเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”

เปƒเบ™เบšเบฒเบ‡เบเปเบฅเบฐเบ™เบต, เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Async/Await เบชเบฒเบกเบฒเบ”เบ™เปเบฒเป„เบ›เบชเบนเปˆเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”.

เบฅเบทเบกเบฅเปเบ–เป‰เบฒ

เบ™เบตเป‰เป€เบเบตเบ”เบ‚เบถเป‰เบ™เป€เบฅเบทเป‰เบญเบเป† - เบ„เปเบฒเบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบฅเปเบ–เป‰เบฒเบ–เบทเบเบฅเบทเบกเบเปˆเบญเบ™เบ„เปเบฒเบชเบฑเบ™เบเบฒ:

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

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰, เบšเปเปˆเบกเบตเบเบฒเบ™เบฅเปเบ–เป‰เบฒเบซเบผเบทเบเบฑเบšเบ„เบทเบ™เบกเบฒเปƒเบ™เบฅเบฐเบซเบฑเบ”. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™ foo เบชเบฐเป€เบซเบกเบตเบญเบญเบเป‚เบ”เบเบšเปเปˆเป„เบ”เป‰เบเปเบฒเบ™เบปเบ”เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบŠเบฑเบเบŠเป‰เบฒ 1 เบงเบดเบ™เบฒเบ—เบต. เปเบ•เปˆเบ„เปเบฒเบชเบฑเบ™เบเบฒเบˆเบฐเบชเปเบฒเป€เบฅเบฑเบ”. เบ–เป‰เบฒเบกเบฑเบ™เบ–เบดเป‰เบกเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบซเบผเบทเบเบฒเบ™เบ›เบฐเบ•เบดเป€เบชเบ”, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ UnhandledPromiseRejectionWarning เบˆเบฐเบ–เบทเบเป€เบญเบตเป‰เบ™.

เบŸเบฑเบ‡เบŠเบฑเบ™ Async เปƒเบ™ Callbacks

เบŸเบฑเบ‡เบŠเบฑเบ™ Async เปเบกเปˆเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบกเบฑเบเปƒเบŠเป‰เปƒเบ™ .map เบซเบผเบท .filter เป€เบ›เบฑเบ™เบเบฒเบ™เป€เบญเบตเป‰เบ™เบ„เบทเบ™. เบ•เบปเบงเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เบŸเบฑเบ‡เบŠเบฑเบ™ fetchPublicReposCount(เบŠเบทเปˆเบœเบนเป‰เปƒเบŠเป‰), เป€เบŠเบดเปˆเบ‡เบชเบปเปˆเบ‡เบ„เบทเบ™เบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡ repositories เป€เบ›เบตเบ”เบขเบนเปˆเปƒเบ™ GitHub. เปƒเบซเป‰เป€เบงเบปเป‰เบฒเบงเปˆเบฒเบกเบตเบชเบฒเบกเบœเบนเป‰เปƒเบŠเป‰เบ—เบตเปˆเบกเบต metrics เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™. เบ™เบตเป‰เปเบกเปˆเบ™เบฅเบฐเบซเบฑเบ”เบชเปเบฒเบฅเบฑเบšเบงเบฝเบเบ‡เบฒเบ™เบ™เบตเป‰:

const url = 'https://api.github.com/users';
 
// Utility fn to fetch repo counts
const fetchPublicReposCount = async (username) => {
  const response = await fetch(`${url}/${username}`);
  const json = await response.json();
  return json['public_repos'];
}

เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบšเบฑเบ™เบŠเบต ArfatSalman, octocat, norvig. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเป€เบฎเบฑเบ”:

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

เบกเบฑเบ™เบ„เบธเป‰เบกเบ„เปˆเบฒเบ—เบตเปˆเบˆเบฐเปƒเบซเป‰เบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเบเบฑเบš Await เปƒเบ™ .map callback. เบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เบ™เบฑเบšเป€เบ›เบฑเบ™เบญเบฒเป€เบฃเบ‚เบญเบ‡เบ„เปเบฒเบชเบฑเบ™เบเบฒ, เปเบฅเบฐ .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;
}

เบ—เบตเปˆเบ™เบตเป‰, เบˆเปเบฒเบ™เบงเบ™ repo เปเบกเปˆเบ™เบ–เบทเบเบˆเบฑเบ”เปƒเบชเปˆเบขเบนเปˆเปƒเบ™เบ•เบปเบงเปเบ›เบเบฒเบ™เบ™เบฑเบš, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ•เบปเบงเป€เบฅเบเบ™เบตเป‰เบˆเบฐเบ–เบทเบเป€เบžเบตเปˆเบกเป€เบ‚เบปเป‰เบฒเปƒเบ™เบเบฒเบ™เบ™เบฑเบš array. เบšเบฑเบ™เบซเบฒเบเบฑเบšเบฅเบฐเบซเบฑเบ”เปเบกเปˆเบ™เบงเปˆเบฒเบˆเบปเบ™เบเปˆเบงเบฒเบ‚เปเป‰เบกเบนเบ™เบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰เบ—เปเบฒเบญเบดเบ”เบกเบฒเบฎเบญเบ”เบˆเบฒเบเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ, เบœเบนเป‰เปƒเบŠเป‰เบ•เปเปˆเบกเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เบˆเบฐเบขเบนเปˆเปƒเบ™เป‚เบซเบกเบ”เบชเบฐเปเบ•เบ™เบšเบฒเบ. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบฝเบ‡เปเบ•เปˆเบซเบ™เบถเปˆเบ‡เบœเบนเป‰เปƒเบŠเป‰เบ–เบทเบเบ›เบฐเบกเบงเบ™เบœเบปเบ™เปƒเบ™เป€เบงเบฅเบฒ.

เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡, เบกเบฑเบ™เปƒเบŠเป‰เป€เบงเบฅเบฒเบ›เบฐเบกเบฒเบ™ 300 ms เปƒเบ™เบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡เบซเบ™เบถเปˆเบ‡เบœเบนเป‰เปƒเบŠเป‰, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เปƒเบŠเป‰เบ—เบฑเบ‡เบซเบกเบปเบ”เบกเบฑเบ™เปเบกเปˆเบ™เปเบฅเป‰เบงเบงเบดเบ™เบฒเบ—เบต; เปเบ•เปˆเป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบเบฒเบ™เป„เบ”เป‰เบฎเบฑเบšเบˆเปเบฒเบ™เบงเบ™ repo เบšเปเปˆเป„เบ”เป‰เบ‚เบถเป‰เบ™เบเบฑเบšเบเบฑเบ™เปเบฅเบฐเบเบฑเบ™, เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบชเบฒเบกเบฒเบ”เบ‚เบฐเบซเบ™เบฒเบ™เป„เบ”เป‰. เบญเบฑเบ™เบ™เบตเป‰เบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš .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 เป„เบ”เป‰เบฎเบฑเบš array เบ‚เบญเบ‡เบชเบฑเบ™เบเบฒเป€เบ›เบฑเบ™ input เปเบฅเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™เบ„เปเบฒเบชเบฑเบ™เบเบฒ. เบญเบฑเบ™เบชเบธเบ”เบ—เป‰เบฒเบเปเบกเปˆเบ™เบชเปเบฒเป€เบฅเบฑเบ”เบซเบผเบฑเบ‡เบˆเบฒเบเบชเบฑเบ™เบเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™ array เบชเปเบฒเป€เบฅเบฑเบ”เบซเบผเบทเบขเบนเปˆเปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเป€เบชเบ”เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”. เบกเบฑเบ™เบญเบฒเบ”เบˆเบฐเป€เบเบตเบ”เบ‚เบทเป‰เบ™เบงเปˆเบฒเบžเบงเบเป€เบ‚เบปเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เบšเปเปˆเป„เบ”เป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™ - เป€เบžเบทเปˆเบญเบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบžเป‰เบญเบกเป†เบเบฑเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰ p-map.

เบชเบฐเบซเบฅเบธเบš

เบŸเบฑเบ‡เบŠเบฑเบ™ Async เบเปเบฒเบฅเบฑเบ‡เบเบฒเบเป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบชเปเบฒเบ„เบฑเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ. เบ”เบต, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เบ›เบฑเบšเบ•เบปเบงเบ‚เบญเบ‡เบŸเบฑเบ‡เบŠเบฑเบ™ async, เบ—เปˆเบฒเบ™เบ„เบงเบ™เปƒเบŠเป‰ Async Iterators. เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ JavaScript เบ„เบงเบ™เบฎเบนเป‰เบ”เบตเปƒเบ™เป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰.

Skillbox เปเบ™เบฐเบ™เปเบฒ:

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™