рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ JavaScript рдорд╛ Async/Await рд╣реЗрд░реМрдВ

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

рд╣рд╛рдореА рд╕рдореНрдЭрд╛рдЙрдБрдЫреМрдВ: рд╕рдмреИ Habr рдкрд╛рдардХрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ - Habr рдкреНрд░реЛрдореЛ рдХреЛрдб рдкреНрд░рдпреЛрдЧ рдЧрд░реА рдХреБрдиреИ рдкрдирд┐ Skillbox рдкрд╛рдареНрдпрдХреНрд░рдордорд╛ рднрд░реНрдирд╛ рдЧрд░реНрджрд╛ резреж,режрежреж рд░реВрдмрд▓ рдЫреБрдЯред

Skillbox рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджрдЫ: рд╢реИрдХреНрд╖рд┐рдХ рдЕрдирд▓рд╛рдЗрди рдкрд╛рдареНрдпрдХреНрд░рдо "рдЬрд╛рднрд╛ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛".

рдХрд▓рдмреНрдпрд╛рдХ

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

рдпрд╣рд╛рдБ 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 рдмрд╛рдЯ рд░реВрдкрд╛рдиреНрддрд░рдг рд╣реБрдиреНрдЫ; const a = рдкреНрд░рддреАрдХреНрд╖рд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН Promise.resolve(9);ред
  • Await рдХреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рд╕рдХреЗрдкрдЫрд┐, рдпрд╕рдХреЛ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдирднрдПрд╕рдореНрдо рдкреНрд░рдХрд╛рд░реНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд┐рд▓рдореНрдмрд┐рдд рд╣реБрдиреНрдЫ (рд╣рд╛рд▓рдХреЛ рдЕрд╡рд╕реНрдерд╛рдорд╛ рдпреЛ 9 рд╣реЛ)ред
  • delayAndGetRandom(1000) рд▓реЗ fn рдкреНрд░рдХрд╛рд░реНрдпрдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирд▓рд╛рдИ рдкрдЬ рдЧрд░реНрдЫ рдЬрдмрд╕рдореНрдо рдпреЛ рдЖрдлреИрдВ рдкреВрд░рд╛ рд╣реБрдБрджреИрди (рез рд╕реЗрдХреЗрдиреНрдб рдкрдЫрд┐)ред рдпрд╕рд▓реЗ рдкреНрд░рднрд╛рд╡рдХрд╛рд░реА рд░реВрдкрдорд╛ 1 рд╕реЗрдХреЗрдиреНрдбрдХреЛ рд▓рд╛рдЧрд┐ fn рдкреНрд░рдХрд╛рд░реНрдп рд░реЛрдХреНрдЫред
  • delayAndGetRandom(1000) via resolution рд▓реЗ рдЕрдирд┐рдпрдорд┐рдд рдорд╛рди рдлрд░реНрдХрд╛рдЙрдБрдЫ, рдЬреБрди рддреНрдпрд╕рдкрдЫрд┐ рдЪрд░ b рдорд╛ рддреЛрдХрд┐рдПрдХреЛ рдЫред
  • рдЦреИрд░, рдЪрд▓ c рдХреЛ рдорд╛рдорд▓рд╛ рдЪрд░ рдП рдХреЛ рдорд╛рдорд▓рд╛ рдЬрд╕реНрддреИ рдЫред рддреНрдпрд╕ рдкрдЫрд┐, рд╕рдмреИ рдПрдХ рд╕реЗрдХреЗрдиреНрдбрдХреЛ рд▓рд╛рдЧрд┐ рд░реЛрдХрд┐рдиреНрдЫ, рддрд░ рдЕрдм delayAndGetRandom(1000) рд▓реЗ рдХреЗрд╣рд┐ рдлрд░реНрдХрд╛рдЙрдБрджреИрди рдХрд┐рдирднрдиреЗ рдпреЛ рдЖрд╡рд╢реНрдпрдХ рдЫреИрдиред
  • рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛, рдорд╛рдирд╣рд░реВ рд╕реВрддреНрд░ a + b * c рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЧрдгрдирд╛ рдЧрд░рд┐рдиреНрдЫред рдкрд░рд┐рдгрд╛рдо Promise.resolve рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╡рд╛рдЪрд╛рдорд╛ рдмреЗрд░рд┐рдПрдХреЛ рдЫ рд░ рдкреНрд░рдХрд╛рд░реНрдпрджреНрд╡рд╛рд░рд╛ рдлрд░реНрдХрд╛рдЗрдПрдХреЛ рдЫред

рдпреА рдкрдЬрд╣рд░реВ ES6 рдорд╛ рдЬреЗрдиреЗрд░реЗрдЯрд░рд╣рд░реВрдХреЛ рд╕рдореНрдЭрдирд╛ рджрд┐рд▓рд╛рдЙрдиреЗ рд╣реБрди рд╕рдХреНрдЫ, рддрд░ рддреНрдпрд╣рд╛рдБ рдХреЗрд╣реА рдЫ рддрдкрд╛рдИрдВрдХреЛ рдХрд╛рд░рдгрд╣рд░реВ.

рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрдиреЗ

рдЦреИрд░, рдЕрдм рдорд╛рдерд┐ рдЙрд▓реНрд▓реЗрдЦрд┐рдд рд╕рдорд╕реНрдпрд╛рдХреЛ рд╕рдорд╛рдзрд╛рди рд╣реЗрд░реМрдВред

FinishMyTask рдкреНрд░рдХрд╛рд░реНрдпрд▓реЗ queryDatabase, sendEmail, logTaskInFile, рд░ рдЕрдиреНрдп рдЬрд╕реНрддрд╛ рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рдирддрд┐рдЬрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдкрд░реНрдЦрди рдкреНрд░рддреАрдХреНрд╖рд╛ рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫред рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдпреЛ рд╕рдорд╛рдзрд╛рдирд▓рд╛рдИ рдкреНрд░рддрд┐рдЬреНрдЮрд╛рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рднрдПрдХреЛ рд╕рдорд╛рдзрд╛рдирд╕рдБрдЧ рддреБрд▓рдирд╛ рдЧрд░реНрдиреБрднрдпреЛ рднрдиреЗ, рд╕рдорд╛рдирддрд╛рд╣рд░реВ рд╕реНрдкрд╖реНрдЯ рд╣реБрдиреЗрдЫрдиреНред рдпрджреНрдпрдкрд┐, 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 рд╕рдБрдЧ рдлрд░реНрдХрд┐рдиреЗрдЫ, undefined рд╕рдБрдЧ рд╣реЛрдЗрдиред рд░рд┐рдЯрд░реНрди await canRejectOrReturn() рд▓рд╛рдЗрди рд╣рдЯрд╛рдПрд░ рдпреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реМрдВ:

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

рд╕рд╛рдорд╛рдиреНрдп рдЧрд▓реНрддреА рд░ рдЧрд▓реНрддреАрд╣рд░реВ

рдХреЗрд╣реА рдЕрд╡рд╕реНрдерд╛рдорд╛, Async/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'];
}

рд╣рд╛рдореАрд▓рд╛рдИ 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 ms рд▓рд╛рдЧреНрдЫ, рддреНрдпрд╕рдкрдЫрд┐ рд╕рдмреИ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдпреЛ рдкрд╣рд┐рд▓реЗ рдиреИ рдПрдХ рд╕реЗрдХреЗрдиреНрдб рд╣реЛ; рд░реИрдЦрд┐рдХ рд░реВрдкрдорд╛ рдЦрд░реНрдЪ рдЧрд░рд┐рдПрдХреЛ рд╕рдордп рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛рдорд╛ рдирд┐рд░реНрднрд░ рдЧрд░реНрджрдЫред рддрд░ рд░рд┐рдкреЛ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдПрдХ рдЕрд░реНрдХрд╛рдорд╛ рдирд┐рд░реНрднрд░ рдЧрд░реНрджреИрди, рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рд╕рдорд╛рдирд╛рдиреНрддрд░ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рдпрд╕рдХрд╛ рд▓рд╛рдЧрд┐ .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ред рдПрдХ рдЬрд╛рднрд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛ рдпрд╕рдорд╛ рд░рд╛рдореНрд░реЛрд╕рдБрдЧ рдирд┐рдкреБрдг рд╣реБрдиреБрдкрд░реНрдЫред

Skillbox рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджрдЫ:

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди