рдЖрдЗрдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ Async/Await рдХреЛ рджреЗрдЦреЗрдВ

рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ Async/Await рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, Async/Await рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рд╣реИред рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдкреНрд░рдХрдЯ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдРрд╕рд╛ рдХреЛрдб рдХреЙрд▓рдмреИрдХ рдФрд░ рд╡рд╛рджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдореВрд▓ рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрдХ рдиреЗ рд╡рд┐рднрд┐рдиреНрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдХреЗ Async/Await рдХреЗ рдлрд╛рдпрджреЛрдВ рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдХрд┐рдпрд╛ рд╣реИред

рдЕрдиреБрд╕реНрдорд╛рд░рдХ: "рд╣реИрдмрд░" рдХреЗ рд╕рднреА рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП - "рд╣реИрдмрд░" рдкреНрд░рдЪрд╛рд░ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдкрд╛рдареНрдпрдХреНрд░рдо рдореЗрдВ рдирд╛рдорд╛рдВрдХрди рдХрд░рддреЗ рд╕рдордп 10 рд░реВрдмрд▓ рдХреА рдЫреВрдЯред

рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реИ: рд╢реИрдХреНрд╖рд┐рдХ рдСрдирд▓рд╛рдЗрди рдкрд╛рдареНрдпрдХреНрд░рдо "рдЬрд╛рд╡рд╛ рдбреЗрд╡рд▓рдкрд░".

рдХреЙрд▓рдмреИрдХ

рдХреЙрд▓рдмреИрдХ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕рдХреА рдХреЙрд▓ рдЕрдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд▓ рддрдХ рд╡рд┐рд▓рдВрдмрд┐рдд рд╣реЛрддреА рд╣реИред рдкрд╣рд▓реЗ, рдХреЙрд▓рдмреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЛрдб рдХреЗ рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛ рдЬрд╣рд╛рдВ рдкрд░рд┐рдгрд╛рдо рддреБрд░рдВрдд рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛ред

рдпрд╣рд╛рдВ Node.js рдореЗрдВ рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдкрдврд╝рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

fs.readFile(__filename, 'utf-8', (err, data) => {
  if (err) {
    throw err;
  }
  console.log(data);
});

рд╕рдорд╕реНрдпрд╛рдПрдБ рддрдм рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВ рдЬрдм рдЖрдкрдХреЛ рдПрдХ рд╕рд╛рде рдХрдИ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЖрдЗрдП рдЗрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ: рдЕрд░рдлрд╝рд╛рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓_img_url рдлрд╝реАрд▓реНрдб рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ someserver.com рд╕рд░реНрд╡рд░ рд╕реЗ рдПрдХ рдЫрд╡рд┐ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЫрд╡рд┐ рдХреЛ рджреВрд╕рд░реЗ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреАрдПрдирдЬреА рд╕реЗ рдЬреЗрдкреАрдИрдЬреА рдореЗрдВред рдпрджрд┐ рд░реВрдкрд╛рдВрддрд░рдг рд╕рдлрд▓ рд░рд╣рд╛, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдИрдореЗрд▓ рдкрд░ рдПрдХ рдкрддреНрд░ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж, рдЗрд╡реЗрдВрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдореЗрд╢рди.рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджрд░реНрдЬ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рддрд╛рд░реАрдЦ рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХреЛрдб рдХреЗ рдЕрдВрддрд┐рдо рднрд╛рдЧ рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдХреЗ рдУрд╡рд░рд▓реИрдк рдФрд░ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ }) рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЙрдЪрд┐рдд рд╣реИред рдЗрд╕реЗ рдХреЙрд▓рдмреИрдХ рдирд░реНрдХ рдпрд╛ рдХрдпрд╛рдордд рдХрд╛ рдкрд┐рд░рд╛рдорд┐рдб рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рдиреБрдХрд╕рд╛рди рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ:

  • рдЗрд╕ рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛ рдХрдард┐рди рд╣реИ.
  • рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рднреА рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдЕрдХреНрд╕рд░ рдХреЛрдб рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдЦрд░рд╛рдм рд╣реЛ рдЬрд╛рддреА рд╣реИред

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╡рд╛рджреЗ рдЬреЛрдбрд╝реЗ рдЧрдПред рд╡реЗ рдЖрдкрдХреЛ рдХреЙрд▓рдмреИрдХ рдХреА рдбреАрдк рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХреЛ .then рд╢рдмреНрдж рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред

рд╡рд╛рджреЛрдВ рдХрд╛ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкрд╣рд▓реВ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдХреЛрдб рдХреЛ рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ рдХреЗ рдмрдЬрд╛рдп рдКрдкрд░ рд╕реЗ рдиреАрдЪреЗ рддрдХ рдмреЗрд╣рддрд░ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╡рд╛рджреЛрдВ рдХреА рднреА рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛рдПрдБ рд╣реИрдВ:

  • рдЖрдкрдХреЛ рдмрд╣реБрдд рдХреБрдЫ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
  • рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕/рдкрдХрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп .catch рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рдПрдХ рд▓реВрдк рдХреЗ рднреАрддрд░ рдХрдИ рд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ; рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╡реЗ рдХреЛрдб рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рддреЗ рд╣реИрдВред

рдпрд╣рд╛рдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬреЛ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рдХрд╛ рдЕрд░реНрде рдмрддрд╛рдПрдЧреАред

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд▓реВрдк рд╣реИ рдЬреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЕрдВрддрд░рд╛рд▓ (0-рдПрди рд╕реЗрдХрдВрдб) рдкрд░ 10 рд╕реЗ 0 рддрдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдЕрдиреБрдХреНрд░рдо рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИред рд╡рд╛рджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдкрдХреЛ рдЗрд╕ рд▓реВрдк рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╕рдВрдЦреНрдпрд╛рдПрдВ 0 рд╕реЗ 10 рддрдХ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдореБрджреНрд░рд┐рдд рд╣реЛ рдЬрд╛рдПрдВред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рд╢реВрдиреНрдп рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдореЗрдВ 6 рд╕реЗрдХрдВрдб рд▓рдЧрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдореЗрдВ 2 рд╕реЗрдХрдВрдб рд▓рдЧрддреЗ рд╣реИрдВ, рддреЛ рд╢реВрдиреНрдп рдХреЛ рдкрд╣рд▓реЗ рдкреНрд░рд┐рдВрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдлрд┐рд░ рдЬрд┐рд╕реЗ рдЫрд╛рдкрдиреЗ рдХреА рдЙрд▓рдЯреА рдЧрд┐рдирддреА рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧреАред

рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╣рдо рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Async/Await рдпрд╛ .sort рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕рдорд╛рдзрд╛рди рдЕрдВрдд рдореЗрдВ рд╣реИ.

рдПрд╕рд┐рдВрдХ рдлрд╝рдВрдХреНрд╢рди

ES2017 (ES8) рдореЗрдВ async рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рд╕рд░рд▓ рд╣реЛ рдЧрдпрд╛ред рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдПрд╕рд┐рдВрдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╡рд╛рджреЛрдВ рдХреЗ "рд╢реАрд░реНрд╖ рдкрд░" рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдпреЗ рдлрд╝рдВрдХреНрд╢рди рдЧреБрдгрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рднрд┐рдиреНрди рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред Async рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЙрд╕ рдХреЛрдб рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИ рдЬреЛ рд╡рд╛рджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

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

рдирд╛рдпрдм! рдпрд╣ рдпрд╛рдж рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдЧреЗрдЯрд░реНрд╕/рд╕реЗрдЯрд░реНрд╕ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗред

рд╢рдмреНрджрд╛рд░реНрде рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдирд┐рдпрдо

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

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд╛рджрд╛ "рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ" рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлрд╝рдВрдХреНрд╢рди рд╣рдореЗрд╢рд╛ рдПрдХ рдирдП рд╡рд╛рджреЗ рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрджрд┐ рд░рд┐рдЯрд░реНрди рдорд╛рди рдПрдХ рдЖрджрд┐рдо рд╣реИ, рддреЛ рдПрд╕рд┐рдВрдХ рдлрд╝рдВрдХреНрд╢рди рдорд╛рди рдХреЛ рдПрдХ рд╡рд╛рджреЗ рдореЗрдВ рд▓рдкреЗрдЯрдХрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдПрдХ рд╡рд╛рджрд╛ рд╡рд╕реНрддреБ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдПрдХ рдирдП рд╡рд╛рджреЗ рдореЗрдВ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

рдФрд░ рдпрд╣рд╛рдВ рдЗрд╕рдХрд╛ рд╡рд┐рд╡рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдПрдлрдПрди рдлрд╝рдВрдХреНрд╢рди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

  • рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ const a = wait 9 рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддреА рд╣реИ; рд╕реНрдерд┐рд░рд╛рдВрдХ рдореЗрдВ = рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ Promise.resolve(9);
  • рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рддрдм рддрдХ рдирд┐рд▓рдВрдмрд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЙрд╕реЗ рдЕрдкрдирд╛ рдорд╛рди рдирд╣реАрдВ рдорд┐рд▓ рдЬрд╛рддрд╛ (рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╣ 9 рд╣реИ)ред
  • DelayAndGetRandom(1000) fn рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рддрдм рддрдХ рд░реЛрдХ рджреЗрддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рд╕реНрд╡рдпрдВ рдкреВрд░рд╛ рди рд╣реЛ рдЬрд╛рдП (1 рд╕реЗрдХрдВрдб рдХреЗ рдмрд╛рдж)ред рдпрд╣ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ fn рдлрд╝рдВрдХреНрд╢рди рдХреЛ 1 рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рд░реЛрдХ рджреЗрддрд╛ рд╣реИред
  • рдбрд┐рд▓реЗрдПрдВрдбрдЧреЗрдЯрд░реИрдВрдбрдо(1000) рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рд╡реЗрд░рд┐рдПрдмрд▓ рдмреА рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рдЦреИрд░, рд╡реЗрд░рд┐рдПрдмрд▓ рд╕реА рдХрд╛ рдорд╛рдорд▓рд╛ рд╡реЗрд░рд┐рдПрдмрд▓ рдП рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд╕рдорд╛рди рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╕рдм рдХреБрдЫ рдПрдХ рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рд░реБрдХ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рджреЗрд░реАрдПрдВрдбрдЧреЗрдЯрд░реИрдВрдбрдо(1000) рдХреБрдЫ рднреА рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
  • рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдорд╛рдиреЛрдВ рдХреА рдЧрдгрдирд╛ рд╕реВрддреНрд░ a + b * c рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреА рдЬрд╛рддреА рд╣реИред рдкрд░рд┐рдгрд╛рдо рдХреЛ Promise.resolve рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╡рд╛рджреЗ рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпреЗ рд░реБрдХрд╛рд╡рдЯреЗрдВ ES6 рдореЗрдВ рдЬрдирд░реЗрдЯрд░ рдХреА рдпрд╛рдж рджрд┐рд▓рд╛ рд╕рдХрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдХреБрдЫ рдмрд╛рдд рд╣реИ рдЖрдкрдХреЗ рдХрд╛рд░рдг.

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди

рдЦреИрд░, рдЕрдм рдКрдкрд░ рдмрддрд╛рдИ рдЧрдИ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдкрд░ рдирдЬрд░ рдбрд╛рд▓рддреЗ рд╣реИрдВред

рдлрд┐рдирд┐рд╢рдорд╛рдпрдЯрд╛рд╕реНрдХ рдлрд╝рдВрдХреНрд╢рди рдХреНрд╡реЗрд░реАрдбреЗрдЯрд╛рдмреЗрд╕, рд╕реЗрдВрдбрдИрдореЗрд▓, рд▓реЙрдЧрдЯрд╛рд╕реНрдХрдЗрдирдлрд╛рдЗрд▓ рдФрд░ рдЕрдиреНрдп рдЬреИрд╕реЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреА рддреБрд▓рдирд╛ рдЙрд╕ рд╕рдорд╛рдзрд╛рди рд╕реЗ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рд╡рд╛рджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рд╕рдорд╛рдирддрд╛рдПрдВ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдВрдЧреАред рд╣рд╛рд▓рд╛рдБрдХрд┐, 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 рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕/рдкрдХрдбрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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 рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕ рдЖрдПрдЧрд╛, рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗ рд╕рд╛рде рдирд╣реАрдВред рдЖрдЗрдП рд░рд┐рдЯрд░реНрди рд╡реЗрдЯ canRejectOrReturn() рд▓рд╛рдЗрди рдХреЛ рд╣рдЯрд╛рдХрд░ рдЗрд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ:

try {
    const value = await canRejectOrReturn();
    return value;
}
// тАж

рд╕рд╛рдорд╛рдиреНрдп рдЧрд▓рддрд┐рдпрд╛рдБ рдФрд░ рдиреБрдХрд╕рд╛рди

рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, Async/Await рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рддреНрд░реБрдЯрд┐рдпрд╛рдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред

рдЗрдВрддрдЬрд╝рд╛рд░ рднреВрд▓ рдЧрдпрд╛

рдРрд╕рд╛ рдЕрдХреНрд╕рд░ рд╣реЛрддрд╛ рд╣реИ - рд╡рд╛рджреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреАрд╡рд░реНрдб рдХреЛ рднреБрд▓рд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

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

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЛрдб рдореЗрдВ рдХреЛрдИ wait рдпрд╛ return рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП 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 рдХреЙрд▓рдмреИрдХ рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЙрдЪрд┐рдд рд╣реИред рдпрд╣рд╛рдВ рдХрд╛рдЙрдВрдЯреНрд╕ рд╡рд╛рджреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИ, рдФрд░ .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 рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рджреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╡рд╛рджрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз, рд╕рд░рдгреА рдореЗрдВ рд╕рднреА рд╡рд╛рджреЗ рдкреВрд░реЗ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдпрд╛ рдкрд╣рд▓реА рдЕрд╕реНрд╡реАрдХреГрддрд┐ рдкрд░, рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рд╕рднреА рдПрдХ рд╣реА рд╕рдордп рдкрд░ рдкреНрд░рд╛рд░рдВрдн рди рд╣реЛрдВ - рдПрдХ рд╕рд╛рде рдкреНрд░рд╛рд░рдВрдн рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдкреА-рдореИрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдирд┐рд╖реНрдХрд░реНрд╖

рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП Async рдлрд╝рдВрдХреНрд╢рдВрд╕ рддреЗрдЬреА рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрддреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдЦреИрд░, рдПрд╕рд┐рдВрдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдЕрдиреБрдХреВрд▓реА рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИ рдПрд╕рд┐рдВрдХ рдЗрдЯрд░реЗрдЯрд░реНрд╕. рдПрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЗрд╕рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд╛рд░рдВрдЧрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реИ:

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ