рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдпрд╛

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░!

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

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдПрдХ рдорд▓реНрдЯреА-рд╕реНрдЯреЗрдЬ рдЗрд╡реЛрд▓реНрдпреВрд╢рди рд╕реЗ рдЧреБрдЬрд╝рд░реА рд╣реИ: рдХреЙрд▓рдмреИрдХ рд╕реЗ рд▓реЗрдХрд░ рд╡рд╛рджреЗ рдФрд░ рдЖрдЧреЗ рдЬрдирд░реЗрдЯрд░ рддрдХ, рдФрд░ рдЬрд▓реНрдж рд╣реА async/await ред рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрд░ рдкрд░, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рд░рд▓ рдерд╛, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рднрд╛рд╖рд╛ рдореЗрдВ рдЕрдкрдирд╛ рд░рд╛рд╕реНрддрд╛ рдмрджрд▓ рджрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреЗрд╡рд▓ рдЕрдзрд┐рдХ рднрдпрд╛рд╡рд╣ рд╣реЛ рдЧрдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рддрд┐рдорд╛рди рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рд╕рдордЭрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдФрд░, рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ, рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рдХреЙрд▓рдмреИрдХ рдФрд░ рд╡рд╛рджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ, рдЬрдирд░реЗрдЯрд░ рдХреЛ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдп рджреЗрдиреЗ рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рд╕реЗ рдпрд╛рдж рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдФрд░ рдлрд┐рд░ рдЖрдкрдХреЛ рд╕рд╣рдЬ рд░реВрдк рд╕реЗ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЬрдирд░реЗрдЯрд░ рдФрд░ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде "рд╣реБрдб рдХреЗ рддрд╣рдд" рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред рд╣рдо рдЖрд╢рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЖрдк рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рддрд┐рдорд╛рдиреЛрдВ рдХреЛ рдареАрдХ рдЙрд╕реА рдЬрдЧрд╣ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рд╡реЗ рдЙрдкрдпреБрдХреНрдд рд╣реИрдВред

рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдардХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ, рд╡рд╛рджреЗ рдФрд░ рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ, рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХрд░реАрдмреА рдФрд░ рдХрд░реАрдиреЗ рд╕реЗ рднреА рдХрд╛рдлреА рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВред

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

рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдХреЙрд▓рдмреИрдХ рдереЗред рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ I / O рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ (рдмрд╛рдж рдореЗрдВ I / O рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдФрд░ рдмреНрд▓реЙрдХрд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдХрд┐рд╕реА рднреА I / O рдХреЗ рдЖрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдпрд╛ рдХрд┐рд╕реА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдРрд╕реА рд░рдгрдиреАрддрд┐ рдХреЛ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛: рдЬрд┐рд╕ рдХреЛрдб рдХреЛ рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рд╡рд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЖрд╕реНрдердЧрд┐рдд рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рд╛рде рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдЗрд╡реЗрдВрдЯ рд▓реВрдк рдореЗрдВ рдиреАрдЪреЗ рдХрд╣реАрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдПрдХ рдХреЙрд▓рдмреИрдХ рдЗрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб рдмрдврд╝рддрд╛ рд╣реИ, рдФрд░ рдХреЙрд▓рдмреИрдХ рдЖрдорддреМрд░ рдкрд░ рдирдП рдХреЙрд▓рдмреИрдХ рдХреЛ рдЬрдиреНрдо рджреЗрддреЗ рд╣реИрдВред рдкрд░рд┐рдгрд╛рдо рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

 getUserData(function doStuff(e, a) { getMoreUserData(function doMoreStuff(e, b) { getEvenMoreUserData(function doEvenMoreStuff(e, c) { getYetMoreUserData(function doYetMoreStuff(e, c) { console.log('Welcome to callback hell!'); }); }); }); }) 

рдЗрд╕ рддрд░рд╣ рдХреЗ рднрдЧреНрди рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдкрд░ рд╣рдВрд╕ рд╕реЗ рдЯрдХрд░рд╛рддрд╛ рд╣реИ, рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИ: рдЕрдм рд╣рдордиреЗ рдЕрдкрдиреЗ do*Stuff рдХрд╛ рдирд┐рдпрдВрддреНрд░рдг do*Stuff рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рддрд░реНрдХ ( get*UserData() , рдЬрд┐рд╕рдореЗрдВ рдЖрдк рд╕реНрд░реЛрдд рдХреЛрдб рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЖрдк рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрдХреАрди рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╡реЗ рдЖрдкрдХреЗ рдХреЙрд▓рдмреИрдХ рдкреНрд░рджрд░реНрд╢рди рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдорд╣рд╛рди, рд╣реИ рдирд╛?

рд╡рд╛рджрд╛

рд╡рд╛рджреЗ рдХреЙрд▓рдмреИрдХ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╡реНрдпреБрддреНрдХреНрд░рдо рдХреЛ рдЙрд▓рдЯ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЪрд┐рдХрдиреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдХреА рдПрдХ рдЙрд▓рдЭрди рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред
рдЕрдм рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 getUserData() .then(getUserData) .then(doMoreStuff) .then(getEvenMoreUserData) .then(doEvenMoreStuff) .then(getYetMoreUserData) .then(doYetMoreStuff); 

рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрддрдирд╛ рдмрджрд╕реВрд░рдд рдирд╣реАрдВ, рд╣реБрд╣?

рд▓реЗрдХрд┐рди, рдореБрдЭреЗ рдЬрд╛рдиреЗ рджреЛ !!! рдЖрдЗрдП рдПрдХ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг (рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдХрд╛рдлреА рд╣рдж рддрдХ рд╡рдВрдЪрд┐рдд) рдХреЙрд▓рдмреИрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:

 // ,     fetchJson(),   GET   , //    :         ,     тАУ   // . function fetchJson(url, callback) { ... } fetchJson('/api/user/self', function(e, user) { fetchJson('/api/interests?userId=' + user.id, function(e, interests) { var recommendations = []; interests.forEach(function () { fetchJson('/api/recommendations?topic=' + interest, function(e, recommendation) { recommendations.push(recommendation); if (recommendations.length == interests.length) { render(profile, interests, recommendations); } }); }); }); }); 

рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЙрд╕рдХреА рд░реБрдЪрд┐рдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдлрд┐рд░ рдЙрд╕рдХреА рд░реБрдЪрд┐рдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рд╕рд┐рдлрд╛рд░рд┐рд╢реЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╕рднреА рд╕рд┐рдлрд╛рд░рд┐рд╢реЛрдВ рдХреЛ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдкреГрд╖реНрда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдХреЙрд▓рдмреИрдХ рдХрд╛ рдРрд╕рд╛ рд╕реЗрдЯ, рдЬреЛ, рд╢рд╛рдпрдж, рдЧрд░реНрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди, рдлрд┐рд░ рднреА, рдпрд╣ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдЭрдмрд░рд╛ рд╣реИред рдХреБрдЫ рднреА рдирд╣реАрдВ, рдпрд╣рд╛рдВ рд╡рд╛рджреЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ - рдФрд░ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рд╣реИ рди?

рдЖрдЗрдП рд╣рдорд╛рд░реЗ fetchJson() рдкрджреНрдзрддрд┐ рдХреЛ рдмрджрд▓реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рдХреЙрд▓рдмреИрдХ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╡рд╛рджрд╛ рд▓реМрдЯрд╛рдПред рдПрдХ рд╡рд╛рджрд╛ JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд╛рд░реНрд╕ рдХреА рдЧрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд┐рдХрд╛рдп рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 fetchJson('/api/user/self') .then(function (user) { return fetchJson('/api/user/interests?userId=' + self.id); }) .then(function (interests) { return Promise.all[interests.map(i => fetchJson('/api/recommendations?topic=' + i))]; }) .then(function (recommendations) { render(user, interests, recommendations); }); 

рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ рдирд╛? рдЕрдм рдЗрд╕ рдХреЛрдб рдореЗрдВ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ?

тАж рдЙрдлрд╝! ..
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдЕрдВрддрд┐рдо рдХрд╛рд░реНрдп рдореЗрдВ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдпрд╛ рд░реБрдЪрд┐рдпреЛрдВ рддрдХ рдкрд╣реБрдБрдЪ рдирд╣реАрдВ рд╣реИ? рддреЛ рдХреБрдЫ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛! рдХреНрдпрд╛ рдХрд░реЗрдВ? рдЪрд▓реЛ рдиреЗрд╕реНрдЯреЗрдб рд╡рд╛рджреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ:

 fetchJson('/api/user/self') .then(function (user) { return fetchJson('/api/user/interests?userId=' + self.id) .then(interests => { user: user, interests: interests }); }) .then(function (blob) { return Promise.all[blob.interests.map(i => fetchJson('/api/recommendations?topic=' + i))] .then(recommendations => { user: blob.user, interests: blob.interests, recommendations: recommendations }); }) .then(function (bigBlob) { render(bigBlob.user, bigBlob.interests, bigBlob.recommendations); }); 

рд╣рд╛рдБ ... рдЕрдм рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рднрджреНрджрд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬрд┐рддрдирд╛ рд╣рдордиреЗ рдЙрдореНрдореАрдж рдХреА рдереАред рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд╛рдЧрд▓ рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рдЧреБрдбрд╝рд┐рдпрд╛ рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо рдХреЙрд▓рдмреИрдХ рдХреЗ рдирд░рдХ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЦрд┐рд░реА, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдЕрдм рдХреНрдпрд╛ рдХрд░реЗрдВ?

рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рдХрдВрдШреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрдВрдж рд╣реЛрдиреЗ рдкрд░ рдЭреБрдХрд╛рд╡:

 //   ,     var user, interests; fetchJson('/api/user/self') .then(function (fetchedUser) { user = fetchedUser; return fetchJson('/api/user/interests?userId=' + self.id); }) .then(function (fetchedInterests) { interests = fetchedInterests; return Promise.all(interests.map(i => fetchJson('/api/recommendations?topic=' + i))); }) .then(function (recomendations) { render(user, interests, recommendations); }) .then(function () { console.log('We are done!'); }); 

рд╣рд╛рдВ, рдЕрдм рд╕рдм рдХреБрдЫ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╣рдо рдЪрд╛рд╣рддреЗ рдереЗ, рд▓реЗрдХрд┐рди рдПрдХ quirk рдХреЗ рд╕рд╛рдеред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдордиреЗ user рдФрд░ interests рдмрдЬрд╛рдп, fetchedUser рдФрд░ fetchedInterests рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдХреЗ рдЕрдВрджрд░ рддрд░реНрдХ рдХреИрд╕реЗ рдХрд╣рд╛? рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдЖрдк рдмрд╣реБрдд рдЪреМрдХрд╕ рд╣реИрдВ!

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

рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЬреЗрдирд░реЗрдЯрд░

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

 co(function* () { var user = yield fetchJson('/api/user/self'); var interests = yield fetchJson('/api/user/interests?userId=' + self.id); var recommendations = yield Promise.all( interests.map(i => fetchJson('/api/recommendations?topic=' + i))); render(user, interests, recommendations); }); 

рд╡рд╣ рд╕рдм рд╣реИред рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдЬрдм рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЬрдирд░реЗрдЯрд░ рдХрд┐рддрдиреЗ рд╕реБрдВрджрд░ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рдЖрдВрд╕реВ рдореЗрдВ рдирд╣реАрдВ рдлреВрдЯреЗрдВрдЧреЗ, рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдЕрдлрд╕реЛрд╕ рд╣реИ рдХрд┐ рдЖрдк рдЗрддрдиреЗ рдЕрджреВрд░рджрд░реНрд╢реА рдереЗ рдФрд░ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╕рд╛рдордиреЗ рдЖрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реАрдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рдерд╛? рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ, рдРрд╕рд╛ рд╡рд┐рдЪрд╛рд░ рдореБрдЭреЗ рдПрдХ рдмрд╛рд░ рдЖрдпрд╛ рдерд╛ред
рд▓реЗрдХрд┐рди ... рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд╛рджреВ?

рдЬрд░реВрд░! .. рдирд╣реАрдВред рд╣рдо рдПрдХреНрд╕рдкреЛрдЬрд░ рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВред

рдЬрдирд░реЗрдЯрд░

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

рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдЬрдирд░реЗрдЯрд░ рдореВрд▓реНрдп рдмрдирд╛рддрд╛ рд╣реИ:

 function* counts(start) { yield start + 1; yield start + 2; yield start + 3; return start + 4; } const counter = counts(0); console.log(counter.next()); // {value: 1, done: false} console.log(counter.next()); // {value: 2, done: false} console.log(counter.next()); // {value: 3, done: false} console.log(counter.next()); // {value: 4, done: true} console.log(counter.next()); // {value: undefined, done: true} 

рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рд╡реИрд╕реЗ рднреА, рдЪрд▓реЛ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ:

  1. const counter = counts(); - рдЬрдирд░реЗрдЯрд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд╡реЗрд░рд┐рдПрдмрд▓ рдХрд╛рдЙрдВрдЯрд░ рдореЗрдВ рд╕реЗрд╡ рдХрд░реЗрдВред рдЬрдирд░реЗрдЯрд░ рд▓рд┐рдореНрдмреЛ рдореЗрдВ рд╣реИ, рдЬрдирд░реЗрдЯрд░ рдмреЙрдбреА рдореЗрдВ рдХреЛрдИ рдХреЛрдб рдЕрднреА рддрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
  2. console.log(counter.next()); - рдЖрдЙрдЯрдкреБрдЯ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ ( yield ) 1, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж 1 рдХреЛ value рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ false done , рдХреНрдпреЛрдВрдХрд┐ рдЖрдЙрдЯрдкреБрдЯ рд╡рд╣рд╛рдВ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ
  3. console.log(counter.next()); - рдЕрдм рез!
  4. console.log(counter.next()); - рдЕрдм рез! рд╣рдо рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ред рдХреНрдпрд╛ рд╕рдм рдХреБрдЫ рд╕рд╣реА рд╣реИ? рдирд╣реАрдВред рдирд┐рд╖реНрдкрд╛рджрди рдЪрд░рдг yield 3; рдореЗрдВ рд░реБрдХрд╛ рд╣реБрдЖ рд╣реИ yield 3; рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдЧрд▓реЗ () рдлрд┐рд░ рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
  5. console.log(counter.next()); - рдЕрдм 4, рдФрд░ рдпрд╣ рд▓реМрдЯрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдм рд╣рдо рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ, рдФрд░ рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИред
  6. console.log(counter.next()); - рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдХрд╛рдо рдЦрддреНрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ! рдЙрд╕рдХреЗ рдкрд╛рд╕ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ "рд╕рдм рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдХрд┐ рдЬрдирд░реЗрдЯрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ! рд▓реЗрдХрд┐рди рд░реБрдХреЛ, рдПрдХ рдЪреМрдВрдХрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╕рдЪ: рдЬрдирд░реЗрдЯрд░ рди рдХреЗрд╡рд▓ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЙрдЧрд▓ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЦрд╛ рднреА рд╕рдХрддрд╛ рд╣реИ!

 function* printer() { console.log("We are starting!"); console.log(yield); console.log(yield); console.log(yield); console.log("We are done!"); } const counter = printer(); counter.next(1); // ! counter.next(2); // 2 counter.next(3); // 3 counter.next(4); // 4\n ! counter.next(5); //    

рдХрд╛рд╣реЗ, рдХреНрдпрд╛ ?! рдПрдХ рдЬрдирд░реЗрдЯрд░ рдореВрд▓реНрдпреЛрдВ рдХреА рдЦрдкрдд рдХрд░рддрд╛ рд╣реИ, рдмрдЬрд╛рдп рдЙрдиреНрд╣реЗрдВ рд╕реНрдкреЙрди рдХрд░рдиреЗ рдХреЗред рдпрд╣ рдХреИрд╕реЗ рд╕рдВрднрд╡ рд╣реИ?

рд░рд╣рд╕реНрдп next рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рд╣реИред рдпрд╣ рди рдХреЗрд╡рд▓ рдЬрдирд░реЗрдЯрд░ рд╕реЗ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЬрдирд░реЗрдЯрд░ рдХреЛ рднреА рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк next() рддрд░реНрдХ рдХреЛ рдмрддрд╛рддреЗ рд╣реИрдВ, рддреЛ yield рдСрдкрд░реЗрд╢рди, рдЬрд┐рд╕рдХрд╛ рдЬрдирд░реЗрдЯрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддрд░реНрдХ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдкрд╣рд▓рд╛ counter.next(1) undefined рд░реВрдк counter.next(1) рдкрдВрдЬреАрдХреГрдд рд╣реИред рдмрд╕ рдХреЛрдИ рдкреНрд░рддреНрдпрд░реНрдкрдг рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

рдпрд╣ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдЬрдирд░реЗрдЯрд░ рдиреЗ рдХреЙрд▓рд┐рдВрдЧ рдХреЛрдб (рдкреНрд░рдХреНрд░рд┐рдпрд╛) рдФрд░ рдЬреЗрдирд░реЗрдЯрд░ рдХреЛрдб (рдкреНрд░рдХреНрд░рд┐рдпрд╛) рдХреЛ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рднрд╛рдЧреАрджрд╛рд░ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рддрд╛рдХрд┐ рд╡реЗ рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рдорд╛рди рджреЗрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЧрдП рдереЗ рдФрд░ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред рд╕реНрдерд┐рддрд┐ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╡реИрд╕реА рд╣реА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдпрджрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕рд╣рдХрд╛рд░реА рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ "рдХреЙрд░рдЖрдЙрдЯ" рднреА рд╣реЛрддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ co() , рдареАрдХ рд╣реИ?

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

рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдЖрдВрддрд░рд┐рдХ рдЙрдкрдХрд░рдг - рд╣рдо рдЬрдирд░реЗрдЯрд░ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ

рдареАрдХ рд╣реИ, рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЬреЗрдПрд╕ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЬреЗрдирд░реЗрдЯрд░ рдЗрдВрдЯрд░реНрдирд▓реНрд╕ рдмрд┐рд▓реНрдХреБрд▓ рдХреИрд╕реЗ рджрд┐рдЦрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред рдЬреЗрдирд░реЗрдЯрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВред рдЬреЗрдирд░реЗрдЯрд░ рдХреЛ рдЗрдВрд╕реНрдЯреЗрдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ "рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░", next(value? : any) рд╡рд┐рдзрд┐, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдЬреЗрдирд░реЗрдЯрд░ рдХреЛ рдХрд╛рдо рдЬрд╛рд░реА рд░рдЦрдиреЗ рдФрд░ рдЙрд╕реЗ рдорд╛рди рджреЗрдиреЗ рдХрд╛ рдЖрджреЗрд╢ рджреЗрддреЗ рд╣реИрдВ, рдПрдХ рдорд╛рди рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдФрд░ throw(error) рд╡рд┐рдзрд┐ рдЙрддреНрдкрдиреНрди throw(error) , рдФрд░ рдЕрдВрдд рдореЗрдВ, рдПрдХ рд╡рд┐рдзрд┐ return() , рдЬреЛ рдЕрднреА рднреА рдЪреБрдк рд╣реИред рдпрджрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИред

рддреЛ, рдЖрдЗрдП рдХреАрд╡рд░реНрдб function* рдмрд┐рдирд╛, рд╢реБрджреНрдз ES5 рдкрд░ рдЙрдкрд░реЛрдХреНрдд counts() рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдЕрднреА рдХреЗ рд▓рд┐рдП, рдЖрдк throw() рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡реИрд▓реНрдпреВ рдХреЛ next() рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдзрд┐ рдХрд┐рд╕реА рдЗрдирдкреБрдЯ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ?

рд▓реЗрдХрд┐рди рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХрдиреЗ рдФрд░ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рддрдВрддреНрд░ рд╣реИ: рдмрдВрдж! рдХреНрдпрд╛ рдпрд╣ рдкрд░рд┐рдЪрд┐рдд рджрд┐рдЦрддрд╛ рд╣реИ?

 function makeCounter() { var count = 1; return function () { return count++; } } var counter = makeCounter(); console.log(counter()); // 1 console.log(counter()); // 2 console.log(counter()); // 3 

рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рдмрдВрдж рдХрд┐рдпрд╛ рдерд╛, рддреЛ рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕рд╛ рдХреБрдЫ рд▓рд┐рдЦрд╛ рд╣реИред рдореЗрдХ рдПрдирдХрд╛рдЙрдВрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдЬрдирд░реЗрдЯрд░ рдХреА рддрд░рд╣ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдЕрдирдВрдд рдЕрдиреБрдХреНрд░рдо рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЬрдирд░реЗрдЯрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕реЗ рд╕реАрдзреЗ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ counts() рд╕рд╛рде рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ 4 рдорд╛рдиреЛрдВ рдФрд░ рд░рд┐рдЯрд░реНрди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИред рдЬрдирд░реЗрдЯрд░ рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ?

рдХреНрд▓реЛрдЬрд░, рд░рд╛рдЬреНрдп рдорд╢реАрди, рдФрд░ рдХрдард┐рди рд╢реНрд░рдо!

 function counts(start) { let state = 0; let done = false; function go() { let result; switch (state) { case 0: result = start + 1; state = 1; break; case 1: result = start + 2; state = 2; break; case 2: result = start + 3; state = 3; break; case 3: result = start + 4; done = true; state = -1; break; default: break; } return {done: done, value: result}; } return { next: go } } const counter = counts(0); console.log(counter.next()); // {value: 1, done: false} console.log(counter.next()); // {value: 2, done: false} console.log(counter.next()); // {value: 3, done: false} console.log(counter.next()); // {value: 4, done: true} console.log(counter.next()); // {value: undefined, done: true} 

рдЗрд╕ рдХреЛрдб рдХреЛ рдЪрд▓рд╛рдиреЗ рд╕реЗ, рдЖрдкрдХреЛ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗред рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ рдирд╛?
рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдЬрдирд░реЗрдЯрд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдкрдХреНрд╖ рдХреЛ рдЫрд╛рдВрдЯрд╛; рдЪрд▓реЛ рдЦрдкрдд рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ?
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИрдВред

 function printer(start) { let state = 0; let done = false; function go(input) { let result; switch (state) { case 0: console.log("We are starting!"); state = 1; break; case 1: console.log(input); state = 2; break; case 2: console.log(input); state = 3; break; case 3: console.log(input); console.log("We are done!"); done = true; state = -1; break; default: break; return {done: done, value: result}; } } return { next: go } } const counter = printer(); counter.next(1); // ! counter.next(2); // 2 counter.next(3); // 3 counter.next(4); // 4 counter.next(5); // ! 

рд╕рднреА рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ input рдХреЛ go рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдП, рдФрд░ рдорд╛рдиреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рдПред рдлрд┐рд░ рд╕реЗ рдЬрд╛рджреВ рд▓рдЧрддрд╛ рд╣реИ? рд▓рдЧрднрдЧ рдЬрдирд░реЗрдЯрд░ рдХреА рддрд░рд╣?

рд╣реБрд░реНрд░реЗ! рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдПрдХ рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рдПрдХ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрдирд░реЗрдЯрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ред рдЗрд╕рдореЗрдВ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛? рдпрд╣рд╛рдБ рдПрдХ рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдПрдХ рдФрд░ рд╕реБрдВрджрд░ рдХреГрддреНрд░рд┐рдо рдЙрджрд╛рд╣рд░рдг рд╣реИ:

 function* adder(initialValue) { let sum = initialValue; while (true) { sum += yield sum; } } 

рдЪреВрдБрдХрд┐ рд╣рдо рдЬреЗрдирд░реЗрдЯрд░ рдХреЗ рд╕рднреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╣реИрдВ, рд╣рдо рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЬрдирд░реЗрдЯрд░ next(value) рдореВрд▓реНрдп рдореЗрдВ рджрд┐рдП рдЧрдП next(value) рдХреЛ sum рджреЗрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд░рд╛рд╢рд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рд╡реИрд╕рд╛ рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рд╣рдо рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ:

 const add = adder(0); console.log(add.next()); // 0 console.log(add.next(1)); // 1 console.log(add.next(2)); // 3 console.log(add.next(3)); // 6 

рдХреВрд▓ред рдЕрдм рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ!

 function adder(initialValue) { let state = 'initial'; let done = false; let sum = initialValue; function go(input) { let result; switch (state) { case 'initial': result = initialValue; state = 'loop'; break; case 'loop': sum += input; result = sum; state = 'loop'; break; default: break; } return {done: done, value: result}; } return { next: go } } function runner() { const add = adder(0); console.log(add.next()); // 0 console.log(add.next(1)); // 1 console.log(add.next(2)); // 3 console.log(add.next(3)); // 6 } runner(); 

рд╡рд╛рд╣, рд╣рдордиреЗ рдПрдХ рдкреВрд░реНрдг-рд╕рдВрдкрдиреНрди рдХреЙрд░реБрдЯрд╛рдЗрди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИред

рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдХреБрдЫ рд╣реИред рдЕрдкрд╡рд╛рдж рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ? рдЬрдирд░реЗрдЯрд░ рдХреЗ рдЕрдВрджрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ: next() рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддрдХ рдкрд╣реБрдВрдЪ рдмрдирд╛ рджреЗрдЧрд╛ рдФрд░ рдЬрдирд░реЗрдЯрд░ рдорд░ рдЬрд╛рдПрдЧрд╛ред рдЬрдирд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкрд╡рд╛рдж рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ throw() рд╡рд┐рдзрд┐ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдКрдкрд░ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдерд╛ред

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

 function* adder(initialValue) { let sum = initialValue; let lastSum = initialValue; let temp; while (true) { try { temp = sum; sum += yield sum; lastSum = temp; } catch (e) { sum = lastSum; } } } const add = adder(0); console.log(add.next()); // 0 console.log(add.next(1)); // 1 console.log(add.next(2)); // 3 console.log(add.throw(new Error('BOO)!'))); // 1 console.log(add.next(4)); // 5 

рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ - рдЬреЗрдирд░реЗрдЯрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╡реЗрд╢

рдХреЙрдорд░реЗрдб, рд╣рдо рдереНрд░реЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ ()?

рдЖрд╕рд╛рдиреА рд╕реЗ! рддреНрд░реБрдЯрд┐ рд╕рд┐рд░реНрдл рдПрдХ рдФрд░ рдореВрд▓реНрдп рд╣реИред рд╣рдо рдЗрд╕реЗ рдЕрдЧрд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ go() рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣рд╛рдВ рдереЛрдбрд╝реА рд╕рд╛рд╡рдзрд╛рдиреА рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЬрдм throw(e) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ yield рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬреИрд╕реЗ рдХрд┐ рд╣рдордиреЗ рдереНрд░реЛ рдИ рд▓рд┐рдЦрд╛ рдерд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЕрдкрдиреЗ рд░рд╛рдЬреНрдп рдорд╢реАрди рдХреА рд╣рд░ рд╕реНрдерд┐рддрд┐ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ рдпрджрд┐ рд╣рдо рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдХреНрд░реИрд╢ рдХрд░ рджреЗрдВред

рдЪрд▓рд┐рдП рдЯрд░реНрдорд┐рдиреЗрдЯрд░ рдХреЗ рдкрд┐рдЫрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдХреЙрдкреА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

рдЯреЗрдореНрдкрд▓реЗрдЯ

рдирд┐рд░реНрдгрдп

рдмреВрдо! рд╣рдордиреЗ рдХреЙрд░рдЖрдЙрдЯ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬрдирд░реЗрдЯрд░ рдХреА рддрд░рд╣ рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рд╕рдВрджреЗрд╢ рдФрд░ рдЕрдкрд╡рд╛рдж рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВред

рд▓реЗрдХрд┐рди рд╕реНрдерд┐рддрд┐ рдмрджрддрд░ рд╣реЛ рд░рд╣реА рд╣реИ, рд╣реИ рдирд╛? рдЬрдирд░реЗрдЯрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рд░рд╛рдЬреНрдп рдорд╢реАрди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рддреЗрдЬреА рд╕реЗ рджреВрд░ рд╣реЛ рд░рд╣рд╛ рд╣реИред рдЗрддрдирд╛ рд╣реА рдирд╣реАрдВ, рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдХрд╛рд░рдг, рдХреЛрдб рдХреЛ рдХрдЪрд░реЗ рд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдХреЛрдб рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рд▓рдВрдмреЗ while рдХрд╛рд░рдг рд╕рднреА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред while рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП while рдЖрдкрдХреЛ рдЗрд╕реЗ рд░рд╛рдЬреНрдпреЛрдВ рдореЗрдВ "рдЕрдирдЯрдВрдЧрд▓" рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рддреЛ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ 1 рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ while 2.5 рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ yield рдмреАрдЪ рдореЗрдВ рдЯреВрдЯ рдЬрд╛рддреА рд╣реИред рдЕрдВрдд рдореЗрдВ, рдЖрдкрдХреЛ рдХреЙрд▓рд░ рд╕реЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдзрдХреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдирд░реЗрдЯрд░ рдореЗрдВ рдХреЛрдИ try/catch рдирд╣реАрдВ рд╣реИред

рдЖрдкрдиреЗ рдХрд░ рджрд┐рдпрд╛ !!! рд╣рдордиреЗ рдЬрдирд░реЗрдЯрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкреВрд░рд╛ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ, рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреЗрд╣рддрд░ рд╕рдордЭ рдЪреБрдХреЗ рд╣реИрдВ рдХрд┐ рдЬрдирд░реЗрдЯрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд╕реВрдЦреЗ рдЕрд╡рд╢реЗрд╖реЛрдВ рдореЗрдВ:

  • рдПрдХ рдЬрдирд░реЗрдЯрд░ рдорд╛рди рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рджреЛрдиреЛрдВред
  • рдЬрдирд░реЗрдЯрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд░рд╛рдЬреНрдп, рд░рд╛рдЬреНрдп рдорд╢реАрди, рдХреИрдЪ?)
  • рдХреЙрд▓рд░ рдФрд░ рдЬрдирд░реЗрдЯрд░ рдЖрдкрдХреЛ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рддреЗ рд╣реБрдП, рдХреЛрд░реБрдЯрд┐рди рдХрд╛ рдПрдХ рд╕реЗрдЯ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ
  • рдЕрдкрд╡рд╛рдж рдХрд┐рд╕реА рднреА рджрд┐рд╢рд╛ рдореЗрдВ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬрдирд░реЗрдЯрд░ рдХреА рдмреЗрд╣рддрд░ рд╕рдордЭ рд╣реИ, рддреЛ рдореИрдВ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрд░реНрдХ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ: рдпреЗ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд╕рд╛рде рдЖрдк рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдЪреИрдирд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ рдорд╛рди рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рд╕рдордп рдореЗрдВ рдПрдХ рдорд╛рди рджреЗрддрд╛ рд╣реИ ( yield )ред рдпрд╣ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдХрд╛рдо рдЖрдПрдЧрд╛, рдЬрд╣рд╛рдВ рд╣рдо рдХреЛрд░рдЯрд╛рдЗрди рд╕реЗ co() рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдВрдЧреЗред

рдХреЙрд░рдЯреАрди рдирд┐рдпрдВрддреНрд░рдг рдЙрд▓рдЯрд╛

рдЕрдм рдЬрдм рд╣рдо рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдХреБрд╢рд▓ рд╣реИрдВ, рддреЛ рдЖрдЗрдП рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдЬрдирд░реЗрдЯрд░ рдХреЛ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЬрдирд░реЗрдЯрд░ рдореЗрдВ рд╡рд╛рджреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣рд▓ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рд▓реЗрдХрд┐рди рд░реБрдХреЛ, рдЬрдирд░реЗрдЯрд░ рдЕрдкрдиреЗ рджрдо рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдПрдХ рдЕрдиреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо, рдореБрдЦреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛, рдЬрд┐рд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИ, рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП .next() рдФрд░ .throw() ред

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдЕрдкрдиреЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЛ рдореБрдЦреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЬрдирд░реЗрдЯрд░ рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ? рдЬрдм рднреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдореВрд▓реНрдп рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рджреЗ рдХреА рддрд░рд╣, рдЬрдирд░реЗрдЯрд░ рдХрд╣реЗрдЧрд╛: "рдореИрдВ рдЗрд╕ рдмрдХрд╡рд╛рд╕ рдХреЗ рд╕рд╛рде рдЧрдбрд╝рдмрдбрд╝ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛, рдЬрдм рдпрд╣ рд╣рд▓ рд╣реЛ рдЬрд╛рдП рддреЛ рдореБрдЭреЗ рдЬрдЧрд╛рдУ", рд╕реЗрд╡рд╛ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рджрд╛ рдЬрд╛рд░реА рдХрд░реЗрдЧрд╛ рдФрд░ рдЬрд╛рд░реА рдХрд░реЗрдЧрд╛ред рд░рдЦрд░рдЦрд╛рд╡ рдкреНрд░рдХреНрд░рд┐рдпрд╛: "рдареАрдХ рд╣реИ, рдореИрдВ рдЖрдкрдХреЛ рдмрд╛рдж рдореЗрдВ рдХреЙрд▓ рдХрд░реВрдВрдЧрд╛ред" рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдпрд╣ рдЗрд╕ рд╡рд╛рджреЗ рдХреЗ рд╕рд╛рде рдПрдХ рдХреЙрд▓рдмреИрдХ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ, рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИ рдФрд░ рддрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдШрдЯрдирд╛рдУрдВ рдХреЗ рдЪрдХреНрд░ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рди рд╣реЛ (рдЕрд░реНрдерд╛рдд, рдЬрдм рд╡рд╛рджрд╛ рд╣рд▓ рд╣реЛ рдЬрд╛рдП)ред рдЬрдм рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ "рд╣реЗ, рдпрд╣ рдЖрдкрдХреА рдмрд╛рд░реА рд╣реИ," рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдЧреА рдФрд░ рд╕реЛ рд░рд╣реЗ рдЬрдирд░реЗрдЯрд░ .next() рдорд╛рдзреНрдпрдо рд╕реЗ рдореВрд▓реНрдп рднреЗрдЬ .next() ред рд╡рд╣ рдЕрдкрдирд╛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдирд░реЗрдЯрд░ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдЧреА, рдФрд░ рдЗрд╕ рдмреАрдЪ рдпрд╣ рдЕрдиреНрдп рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЪреАрдЬреЗрдВ рдХрд░реЗрдЧрд╛ ... рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдЖрдкрдиреЗ рдПрдХ рджреБрдЦрдж рдХрд╣рд╛рдиреА рд╕реБрдиреА рдХрд┐ рдХреИрд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдПрдХ рдЬрдирд░реЗрдЯрд░ рдХреА рд╕реЗрд╡рд╛ рдкрд░ рд░рд╣рддреА рд╣реИред

рддреЛ, рдореБрдЦреНрдп рд╡рд┐рд╖рдп рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред рдЕрдм рдЬрдм рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЬрдирд░реЗрдЯрд░ рдФрд░ рд╡рд╛рджреЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреА "рд╕реЗрд╡рд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛" рдмрдирд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рд╕реЗрд╡рд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдПрдХ рд╡рд╛рджреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрдирд░реЗрдЯрд░ рдХреЛ рдЗрдВрд╕реНрдЯреЗрдВрдЯ рдХрд░рдиреЗ рдФрд░ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдлрд┐рд░ .then() рдХреЙрд▓рдмреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдорд╛рд░реА рдореБрдЦреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдкрд░ рд▓реМрдЯреЗрдВред

рдЕрдЧрд▓рд╛, рдЪрд▓реЛ рд╕рд╣ () рдХрд╛рд░реНрдпрдХреНрд░рдо рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╣реИрдВред co() рдПрдХ рд╕реЗрд╡рд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ рдЬреЛ рджрд╛рд╕ рд╢реНрд░рдо рдкрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИ рддрд╛рдХрд┐ рдЬрдирд░реЗрдЯрд░ рдХреЗрд╡рд▓ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХреЗред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдЕрдзрд┐рдХ рддрд╛рд░реНрдХрд┐рдХ рд▓рдЧрддрд╛ рд╣реИ, рд╣реИ рдирд╛?

 co(function* () { var user = yield fetchJson('/api/user/self'); var interests = yield fetchJson('/api/user/interests?userId=' + self.id); var recommendations = yield Promise.all( interests.map(i => fetchJson('/api/recommendations?topic=' + i))); render(user, interests, recommendations); }); 

, , co() , .

тАФ co()

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛! co() , , . co()

  1. ,
  2. .next() , {done: false, value: [a Promise]}
  3. ( ), .next() ,
  4. , 4
  5. - {done: true, value: ...} , , co()

, co(), :



 function deferred(val) { return new Promise((resolve, reject) => resolve(val)); } co(function* asyncAdds(initialValue) { console.log(yield deferred(initialValue + 1)); console.log(yield deferred(initialValue + 2)); console.log(yield deferred(initialValue + 3)); }); function co(generator) { return new Promise((resolve, reject) => { //   }); } 



, ? - 10 co() , . , . ?

тАУ co()

, , , , co() . , .throw() .



 function deferred(val) { return new Promise((resolve, reject) => resolve(val)); } function deferReject(e) { return new Promise((resolve, reject) => reject(e)); } co(function* asyncAdds() { console.log(yield deferred(1)); try { console.log(yield deferredError(new Error('To fail, or to not fail.'))); } catch (e) { console.log('To not fail!'); } console.log(yield deferred(3)); }); function co(generator) { return new Promise((resolve, reject) => { //   }); } 



. , , .next() onResolve() . onReject() , .throw() . try/catch , , try/catch .

, co() ! ! co() , , , . , ?

: async/await

co() . - , async/await? тАФ ! , async await .

async , await , yield . await , async . async - .

, async/await , , - co() async yield await , * , .

 co(function* () { var user = yield fetchJson('/api/user/self'); var interests = yield fetchJson('/api/user/interests?userId=' + self.id); var recommendations = yield Promise.all( interests.map(i => fetchJson('/api/recommendations?topic=' + i))); render(user, interests, recommendations); }); 

:

 async function () { var user = await fetchJson('/api/user/self'); var interests = await fetchJson('/api/user/interests?userId=' + self.id); var recommendations = await Promise.all( interests.map(i => fetchJson('/api/recommendations?topic=' + i))); render(user, interests, recommendations); }(); 

, :

  • co() . async , . async co() co.wrap() .
  • co() ( yield ) , , . async ( await ) .



Javascript , , ┬л ┬╗ co() , , , async/await . ? рдпрд╣ рд╕рд╣реА рд╣реИред

Source: https://habr.com/ru/post/hi434360/


All Articles