рдЙрджрд╛рд╣рд░рдгреЗ рд╡рд╛рдкрд░реВрди JavaScript рдордзреНрдпреЗ Async/Await рдкрд╛рд╣реВ

рд▓реЗрдЦрд╛рдЪрд╛ рд▓реЗрдЦрдХ JavaScript рдордзреНрдпреЗ Async/Await рдЪреА рдЙрджрд╛рд╣рд░рдгреЗ рддрдкрд╛рд╕рддреЛ. рдПрдХрдВрджрд░реАрдд, рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб рд▓рд┐рд╣рд┐рдгреНрдпрд╛рд╕рд╛рдареА Async/Await рд╣рд╛ рдПрдХ рд╕реЛрдпреАрд╕реНрдХрд░ рдорд╛рд░реНрдЧ рдЖрд╣реЗ. рд╣реЗ рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рджрд┐рд╕рдгреНрдпрд╛рдкреВрд░реНрд╡реА, рдЕрд╕рд╛ рдХреЛрдб рдХреЙрд▓рдмреЕрдХ рдЖрдгрд┐ рд╡рдЪрдиреЗ рд╡рд╛рдкрд░реВрди рд▓рд┐рд╣рд┐рд▓реЗрд▓рд╛ рд╣реЛрддрд╛. рдореВрд│ рд▓реЗрдЦрд╛рдЪреЗ рд▓реЗрдЦрдХ рд╡рд┐рд╡рд┐рдз рдЙрджрд╛рд╣рд░рдгрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реВрди Async/Await рдЪреЗ рдлрд╛рдпрджреЗ рдкреНрд░рдХрдЯ рдХрд░рддрд╛рдд.

рдЖрдореНрд╣реА рдЖрдард╡рдг рдХрд░реВрди рджреЗрддреЛ: рд╕рд░реНрд╡ Habr рд╡рд╛рдЪрдХрд╛рдВрд╕рд╛рдареА - Habr рдкреНрд░реЛрдореЛ рдХреЛрдб рд╡рд╛рдкрд░реВрди рдХреЛрдгрддреНрдпрд╛рд╣реА рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдХреЛрд░реНрд╕рдордзреНрдпреЗ рдирд╛рд╡рдиреЛрдВрджрдгреА рдХрд░рддрд╛рдирд╛ 10 рд░реВрдмрд▓ рд╕рд╡рд▓рдд.

рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ: рд╢реИрдХреНрд╖рдгрд┐рдХ рдСрдирд▓рд╛рдЗрди рдЕрднреНрдпрд╛рд╕рдХреНрд░рдо "рдЬрд╛рд╡рд╛ рд╡рд┐рдХрд╕рдХ".

рдХреЙрд▓рдмреЕрдХ

рдХреЙрд▓рдмреЕрдХ рд╣реЗ рдПрдХ рдлрдВрдХреНрд╢рди рдЖрд╣реЗ рдЬреНрдпрд╛рдЪреНрдпрд╛ рдХреЙрд▓рд▓рд╛ рдЕрдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд│рд╛рд╕рд╛рдареА рд╡рд┐рд▓рдВрдм рд╣реЛрддреЛ. рдкреВрд░реНрд╡реА, рдХреЛрдбрдЪреНрдпрд╛ рддреНрдпрд╛ рднрд╛рдЧрд╛рдд рдХреЙрд▓рдмреЕрдХрдЪрд╛ рд╡рд╛рдкрд░ рдХреЗрд▓рд╛ рдЬрд╛рдд рд╣реЛрддрд╛ рдЬрд┐рдереЗ рдирд┐рдХрд╛рд▓ рд▓рдЧреЗрдЪ рдорд┐рд│реВ рд╢рдХрдд рдирд╡реНрд╣рддрд╛.

Node.js рдордзреНтАНрдпреЗ рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕рд▓реА рдлрд╛рдИрд▓ рд╡рд╛рдЪрдгреНрдпрд╛рдЪреЗ рдЙрджрд╛рд╣рд░рдг рдпреЗрдереЗ рдЖрд╣реЗ:

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

рдЬреЗрд╡реНрд╣рд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рдПрдХрд╛рдЪ рд╡реЗрд│реА рдЕрдиреЗрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рдиреНрд╕ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕рддреЗ рддреЗрд╡реНрд╣рд╛ рд╕рдорд╕реНрдпрд╛ рдЙрджреНрднрд╡рддрд╛рдд. рдЪрд▓рд╛ рдпрд╛ рдкрд░рд┐рд╕реНрдерд┐рддреАрдЪреА рдХрд▓реНрдкрдирд╛ рдХрд░реВрдпрд╛: Arfat рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдбреЗрдЯрд╛рдмреЗрд╕рд▓рд╛ рд╡рд┐рдирдВрддреА рдХреЗрд▓реА рдЬрд╛рддреЗ, рддреБрдореНрд╣рд╛рд▓рд╛ рддреНрдпрд╛рдЪреЗ profile_img_url рдлреАрд▓реНрдб рд╡рд╛рдЪрд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓ рдЖрдгрд┐ someserver.com рд╕рд░реНрд╡реНрд╣рд░рд╡рд░реВрди рдПрдХ рдкреНрд░рддрд┐рдорд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рд╛рд╡реА рд▓рд╛рдЧреЗрд▓.
рдбрд╛рдЙрдирд▓реЛрдб рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рдЖрдореНрд╣реА рдЗрдореЗрдЬ рджреБрд╕рд▒реНрдпрд╛ рдлреЙрд░рдореЕрдЯрдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рддреЛ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде PNG рддреЗ JPEG. рд░реВрдкрд╛рдВрддрд░рдг рдпрд╢рд╕реНрд╡реА рдЭрд╛рд▓реНрдпрд╛рд╕, рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рдИрдореЗрд▓рд╡рд░ рдПрдХ рдкрддреНрд░ рдкрд╛рдард╡рд▓реЗ рдЬрд╛рддреЗ. рдкреБрдвреЗ, рдЗрд╡реНрд╣реЗрдВрдЯрдЪреА рдорд╛рд╣рд┐рддреА transformations.log рдлрд╛рдЗрд▓рдордзреНрдпреЗ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХреЗрд▓реА рдЬрд╛рддреЗ, рддрд╛рд░реАрдЦ рджрд░реНрд╢рд╡рддреЗ.

рдХреЛрдбрдЪреНрдпрд╛ рдЕрдВрддрд┐рдо рднрд╛рдЧрд╛рдд рдХреЙрд▓рдмреЕрдХрдЪреНрдпрд╛ рдЖрдЪреНрдЫрд╛рджрдирд╛рдХрдбреЗ рдЖрдгрд┐ }) рдЪреНрдпрд╛ рдореЛрдареНрдпрд╛ рд╕рдВрдЦреНрдпреЗрдХрдбреЗ рд▓рдХреНрд╖ рджреЗрдгреЗ рдпреЛрдЧреНрдп рдЖрд╣реЗ. рддреНрдпрд╛рд▓рд╛ рдХреЙрд▓рдмреЕрдХ рд╣реЗрд▓ рдХрд┐рдВрд╡рд╛ рдкрд┐рд░реЕрдорд┐рдб рдСрдл рдбреВрдо рдореНрд╣рдгрддрд╛рдд.

рдпрд╛ рдкрджреНрдзрддреАрдЪреЗ рддреЛрдЯреЗ рд╕реНрдкрд╖реНрдЯ рдЖрд╣реЗрдд:

  • рд╣рд╛ рдХреЛрдб рд╡рд╛рдЪрдгреЗ рдХрдареАрдг рдЖрд╣реЗ.
  • рддреНрд░реБрдЯреА рд╣рд╛рддрд╛рд│рдгреЗ рджреЗрдЦреАрд▓ рдЕрд╡рдШрдб рдЖрд╣реЗ, рдЬреНрдпрд╛рдореБрд│реЗ рдХреЛрдбрдЪреА рдЧреБрдгрд╡рддреНрддрд╛ рдЦрд░рд╛рдм рд╣реЛрддреЗ.

рдпрд╛ рд╕рдорд╕реНрдпреЗрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, JavaScript рдордзреНрдпреЗ рд╡рдЪрдиреЗ рдЬреЛрдбрд▓реА рдЧреЗрд▓реА. рддреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдХреЙрд▓рдмреЕрдХрдЪреЗ рдЦреЛрд▓ рдиреЗрд╕реНрдЯрд┐рдВрдЧ рд╢рдмреНрджрд╛рдиреЗ рдмрджрд▓рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддрд╛рдд .рдирдВрддрд░.

рд╡рдЪрдирд╛рдВрдЪрд╛ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреИрд▓реВ рдЕрд╕рд╛ рдЖрд╣реЗ рдХреА рддреЗ рдбрд╛рд╡реАрдХрдбреВрди рдЙрдЬрд╡реАрдХрдбреЗ рдРрд╡рдЬреА рд╡рд░рдкрд╛рд╕реВрди рдЦрд╛рд▓рдкрд░реНрдпрдВрдд рдХреЛрдб рдЕрдзрд┐рдХ рдЪрд╛рдВрдЧрд▓реЗ рд╡рд╛рдЪрдиреАрдп рдмрдирд╡рддрд╛рдд. рддрдерд╛рдкрд┐, рд╡рдЪрдирд╛рдВрдирд╛ рджреЗрдЦреАрд▓ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рдЖрд╣реЗрдд:

  • рддреБрдореНрд╣рд╛рд▓рд╛ рднрд░рдкреВрд░ рдЬреЛрдбрд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓ .рдордЧ.
  • рдкреНрд░рдпрддреНрди/рдХреЕрдЪ рдРрд╡рдЬреА, рд╕рд░реНрд╡ рддреНрд░реБрдЯреА рд╣рд╛рддрд╛рд│рдгреНрдпрд╛рд╕рд╛рдареА .catch рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рддреЗ.
  • рдПрдХрд╛ рд▓реВрдкрдордзреНрдпреЗ рдЕрдиреЗрдХ рд╡рдЪрдирд╛рдВрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреЗ рдиреЗрд╣рдореАрдЪ рд╕реЛрдпреАрдЪреЗ рдирд╕рддреЗ; рдХрд╛рд╣реА рдкреНрд░рдХрд░рдгрд╛рдВрдордзреНрдпреЗ, рддреЗ рдХреЛрдб рдХреНрд▓рд┐рд╖реНрдЯ рдХрд░рддрд╛рдд.

рдпреЗрдереЗ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдЖрд╣реЗ рдЬреА рд╢реЗрд╡рдЯрдЪреНрдпрд╛ рдореБрджреНрджреНрдпрд╛рдЪрд╛ рдЕрд░реНрде рджрд░реНрд╢рд╡реЗрд▓.

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

рдЖрдгрд┐ рдЕрд░реНрдерд╛рддрдЪ, рдпрд╛ рд╕рдорд╕реНрдпреЗрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА Async/Await рдХрд┐рдВрд╡рд╛ .sort рд╡рд╛рдкрд░рдд рдирд╛рд╣реА. рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЙрдкрд╛рдп рд╢реЗрд╡рдЯреА рдЖрд╣реЗ.

Async рдХрд╛рд░реНрдпреЗ

ES2017 (ES8) рдордзреНтАНрдпреЗ async рдлрдВрдХреНтАНрд╢рди рдЬреЛрдбрд▓реНтАНрдпрд╛рдиреЗ рд╡рдЪрдирд╛рдВрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНтАНрдпрд╛рдЪреЗ рдХрд╛рд░реНрдп рд╕реЛрдкреЗ рдЭрд╛рд▓реЗ рдЖрд╣реЗ. рдореА рд▓рдХреНрд╖рд╛рдд рдШреЗрддреЛ рдХреА async рдлрдВрдХреНрд╢рдиреНрд╕ рд╡рдЪрдирд╛рдВрдЪреНрдпрд╛ тАЬрд╢реАрд░реНрд╖тАЭ рдХрд╛рд░реНрдп рдХрд░рддрд╛рдд. рд╣реА рдХрд╛рд░реНрдпреЗ рдЧреБрдгрд╛рддреНрдордХрджреГрд╖реНрдЯреНрдпрд╛ рднрд┐рдиреНрди рд╕рдВрдХрд▓реНрдкрдирд╛ рджрд░реНрд╢рд╡рдд рдирд╛рд╣реАрдд. Async рдлрдВрдХреНрд╢рдиреНрд╕ рдХреЛрдбрдЪрд╛ рдкрд░реНрдпрд╛рдп рдореНрд╣рдгреВрди рдЕрднрд┐рдкреНрд░реЗрдд рдЖрд╣реЗрдд рдЬреЗ рд╡рдЪрдиреЗ рд╡рд╛рдкрд░рддрд╛рдд.

Async/Await рд╕рдордХрд╛рд▓рд┐рдХ рд╢реИрд▓реАрдордзреНрдпреЗ рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдбрд╕рд╣ рдХрд╛рд░реНрдп рдЖрдпреЛрдЬрд┐рдд рдХрд░рдгреЗ рд╢рдХреНрдп рдХрд░рддреЗ.

рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ, рд╡рдЪрдиреЗ рдЬрд╛рдгреВрди рдШреЗрдгреЗ Async/Await рдЪреА рддрддреНрддреНрд╡реЗ рд╕рдордЬреВрди рдШреЗрдгреЗ рд╕реЛрдкреЗ рдХрд░рддреЗ.

рд╡рд╛рдХреНрдпрд░рдЪрдирд╛

рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ рдпрд╛рдд рджреЛрди рдХреАрд╡рд░реНрдб рдЕрд╕рддрд╛рдд: async рдЖрдгрд┐ await. рдкрд╣рд┐рд▓рд╛ рд╢рдмреНрдж рдлрдВрдХреНрд╢рдирд▓рд╛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕рдордзреНрдпреЗ рдмрджрд▓рддреЛ. рдЕрд╢реА рдХрд╛рд░реНрдпреЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддрд╛рдд. рдЗрддрд░ рдХреЛрдгрддреНрдпрд╛рд╣реА рдмрд╛рдмрддреАрдд, рд╣реЗ рдХрд╛рд░реНрдп рд╡рд╛рдкрд░рд▓реНрдпрд╛рдиреЗ рддреНрд░реБрдЯреА рдирд┐рд░реНрдорд╛рдг рд╣реЛрдИрд▓.

// With function declaration
 
async function myFn() {
  // await ...
}
 
// With arrow function
 
const myFn = async () => {
  // await ...
}
 
function myFn() {
  // await fn(); (Syntax Error since no async)
}
 

Async рдлрдВрдХреНрд╢рди рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рдирдЪреНрдпрд╛ рдЕрдЧрджреА рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рдЖрдгрд┐ рдЕреЕрд░реЛ рдлрдВрдХреНрд╢рдирдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, тАЬ=тАЭ рдЪрд┐рдиреНрд╣ рдЖрдгрд┐ рдХрдВрд╕ рдпрд╛рдВрдЪреНрдпрд╛рдордзреНрдпреЗ рдШрд╛рддрд▓рд╛ рдЬрд╛рддреЛ.

рд╣реА рдлрдВрдХреНрд╢рдиреНрд╕ рдСрдмреНрдЬреЗрдХреНрдЯрдордзреНрдпреЗ рдкрджреНрдзрддреА рдореНрд╣рдгреВрди рдареЗрд╡рд▓реА рдЬрд╛рдК рд╢рдХрддрд╛рдд рдХрд┐рдВрд╡рд╛ рдХреНрд▓рд╛рд╕ рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рдирдордзреНрдпреЗ рд╡рд╛рдкрд░рд▓реА рдЬрд╛рдК рд╢рдХрддрд╛рдд.

// As an object's method
 
const obj = {
  async getName() {
    return fetch('https://www.example.com');
  }
}
 
// In a class
 
class Obj {
  async getResource() {
    return fetch('https://www.example.com');
  }
}

NB! рд╣реЗ рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдЖрд╣реЗ рдХреА рдХреНрд▓рд╛рд╕ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЖрдгрд┐ рдЧреЗрдЯрд░реНрд╕/рд╕реЗрдЯрд░реНрд╕ рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЕрд╕реВ рд╢рдХрдд рдирд╛рд╣реАрдд.

рд╢рдмреНрджрд╛рд░реНрде рдЖрдгрд┐ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдЪреЗ рдирд┐рдпрдо

Async рдлрдВрдХреНрд╢рдиреНрд╕ рдореБрд│рд╛рдд рд╕реНрдЯрдБрдбрд░реНрдб JS рдлрдВрдХреНрд╢рдиреНрд╕ рд╕рд╛рд░рдЦреАрдЪ рдЕрд╕рддрд╛рдд, рдкрдг рдЕрдкрд╡рд╛рдж рдЖрд╣реЗрдд.

рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ, async рдлрдВрдХреНрд╢рдиреНрд╕ рдиреЗрд╣рдореА рдЖрд╢реНрд╡рд╛рд╕рдиреЗ рдкрд░рдд рдХрд░рддрд╛рдд:

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

рд╡рд┐рд╢реЗрд╖рддрдГ, fn рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЕрд▓реЛ рдкрд░рдд рдХрд░рддреЗ. рдмрд░рдВ, рд╣реЗ рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлрдВрдХреНрд╢рди рдЕрд╕рд▓реНрдпрд╛рдореБрд│реЗ, рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡реНрд╣реЕрд▓реНрдпреВ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╡рд╛рдкрд░реВрди рд╡рдЪрдирд╛рдд рдЧреБрдВрдбрд╛рд│рд▓реА рдЬрд╛рддреЗ.

рдпреЗрдереЗ Async рд╢рд┐рд╡рд╛рдп рдкрд░реНрдпрд╛рдпреА рдбрд┐рдЭрд╛рдЗрди рдЖрд╣реЗ:

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

рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рд╡рдЪрди "рд╕реНрд╡рддрдГ" рдкрд░рдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ. рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлрдВрдХреНрд╢рди рдиреЗрд╣рдореА рдирд╡реАрди рд╡рдЪрдирд╛рдордзреНрдпреЗ рдЧреБрдВрдбрд╛рд│рд▓реЗрд▓реЗ рдЕрд╕рддреЗ.

рд░рд┐рдЯрд░реНрди рд╡реНрд╣реЕрд▓реНрдпреВ рдкреНрд░рд┐рдорд┐рдЯрд┐рд╡реНрд╣ рдЕрд╕рд▓реНрдпрд╛рд╕, async рдлрдВрдХреНрд╢рди рддреЗ рд╡реНрд╣реЕрд▓реНрдпреВ рдПрдХрд╛ рд╡рдЪрдирд╛рдд рдЧреБрдВрдбрд╛рд│реВрди рдкрд░рдд рдХрд░рддреЗ. рд░рд┐рдЯрд░реНрди рд╡реНрд╣реЕрд▓реНрдпреВ рд╣реЗ рд╡рдЪрди рджрд┐рд▓реЗрд▓реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрд╕рд▓реНрдпрд╛рд╕, рддреНрдпрд╛рдЪреЗ рд░рд┐рдЭреЛрд▓реНрдпреВрд╢рди рдирд╡реАрди рд╡рдЪрдирд╛рдордзреНрдпреЗ рдкрд░рдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ.

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

рдкрд░рдВрддреБ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлрдВрдХреНрд╢рдирдордзреНрдпреЗ рддреНрд░реБрдЯреА рдЕрд╕рд▓реНрдпрд╛рд╕ рдХрд╛рдп рд╣реЛрдИрд▓?

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

рддреНрдпрд╛рд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рди рдХреЗрд▓реНрдпрд╛рд╕, foo() рдирдХрд╛рд░рд╛рд╕рд╣ рд╡рдЪрди рдкрд░рдд рдХрд░реЗрд▓. рдпрд╛ рдкрд░рд┐рд╕реНрдерд┐рддреАрдд, Promise.resolve рдРрд╡рдЬреА рддреНрд░реБрдЯреА рдЕрд╕рд▓реЗрд▓реЗ Promise.reject рдкрд░рдд рдХреЗрд▓реЗ рдЬрд╛рдИрд▓.

Async рдлрдВрдХреНрд╢рдиреНрд╕ рдиреЗрд╣рдореА рдкреНрд░рддрд┐рдЬреНрдЮрд╛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛рдд, рдХрд╛рдп рдкрд░рдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ рдпрд╛рдЪреА рдкрд░реНрд╡рд╛ рди рдХрд░рддрд╛.

рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлрдВрдХреНрд╢рдиреНрд╕ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рддреАрдХреНрд╖реЗрдд рд╡рд┐рд░рд╛рдо рджреЗрддрд╛рдд.

рдкреНрд░рддреАрдХреНрд╖рд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддреА рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ. рдореНрд╣рдгреВрди, рдЕрднрд┐рд╡реНрдпрдХреНрддреА рд╡рдЪрди рдЕрд╕рд▓реНрдпрд╛рд╕, рд╡рдЪрди рдкреВрд░реНрдг рд╣реЛрдИрдкрд░реНрдпрдВрдд async рдХрд╛рд░реНрдп рдирд┐рд▓рдВрдмрд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ. рдЕрднрд┐рд╡реНрдпрдХреНрддреА рд╡рдЪрди рдирд╕рд▓реНрдпрд╛рд╕, рддреЗ Promise.resolve рджреНрд╡рд╛рд░реЗ рд╡рдЪрдирд╛рдд рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ рдЖрдгрд┐ рдирдВрддрд░ рдкреВрд░реНрдг рдХреЗрд▓реЗ рдЬрд╛рддреЗ.

// utility function to cause delay
// and get random value
 
const delayAndGetRandom = (ms) => {
  return new Promise(resolve => setTimeout(
    () => {
      const val = Math.trunc(Math.random() * 100);
      resolve(val);
    }, ms
  ));
};
 
async function fn() {
  const a = await 9;
  const b = await delayAndGetRandom(1000);
  const c = await 5;
  await delayAndGetRandom(1000);
 
  return a + b * c;
}
 
// Execute fn
fn().then(console.log);

рдЖрдгрд┐ рдпреЗрдереЗ fn рдлрдВрдХреНрд╢рди рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рдпрд╛рдЪреЗ рд╡рд░реНрдгрди рдЖрд╣реЗ.

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

рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ:

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛