рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░!
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдпрд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ,
рдЕрдХреНрдЯреВрдмрд░ рдореЗрдВ рд╡рд╛рдкрд╕ рд╣рдо рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЯрд╛рдЗрдорд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░ рд░рд╣реЗ рдереЗред рдЗрд╕рдиреЗ рдПрдХ рдмрдбрд╝реА рдЪрд░реНрдЪрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣рдо рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕ рднрд╛рд╖рд╛ рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдЦреБрд╢реА рд╣реИ рдХрд┐ рд╣рдо рд╕рднреНрдп рд╕рд╛рдордЧреНрд░реА рдЦреЛрдЬрдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ рдФрд░ рдЗрд╕реЗ рд╡рд░реНрд╖ рдХреЗ рдЕрдВрдд рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ред рдЕрдЪреНрдЫрд╛ рдкрдврд╝ рд▓реЛ!
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдПрдХ рдорд▓реНрдЯреА-рд╕реНрдЯреЗрдЬ рдЗрд╡реЛрд▓реНрдпреВрд╢рди рд╕реЗ рдЧреБрдЬрд╝рд░реА рд╣реИ: рдХреЙрд▓рдмреИрдХ рд╕реЗ рд▓реЗрдХрд░ рд╡рд╛рджреЗ рдФрд░ рдЖрдЧреЗ рдЬрдирд░реЗрдЯрд░ рддрдХ, рдФрд░ рдЬрд▓реНрдж рд╣реА
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()
рдкрджреНрдзрддрд┐ рдХреЛ рдмрджрд▓реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рдХреЙрд▓рдмреИрдХ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╡рд╛рджрд╛ рд▓реМрдЯрд╛рдПред рдПрдХ рд╡рд╛рджрд╛ 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); });
рд╣рд╛рдБ ... рдЕрдм рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рднрджреНрджрд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬрд┐рддрдирд╛ рд╣рдордиреЗ рдЙрдореНрдореАрдж рдХреА рдереАред рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд╛рдЧрд▓ рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рдЧреБрдбрд╝рд┐рдпрд╛ рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо рдХреЙрд▓рдмреИрдХ рдХреЗ рдирд░рдХ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЦрд┐рд░реА, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдЕрдм рдХреНрдпрд╛ рдХрд░реЗрдВ?
рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рдХрдВрдШреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрдВрдж рд╣реЛрдиреЗ рдкрд░ рдЭреБрдХрд╛рд╡:
рд╣рд╛рдВ, рдЕрдм рд╕рдм рдХреБрдЫ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╣рдо рдЪрд╛рд╣рддреЗ рдереЗ, рд▓реЗрдХрд┐рди рдПрдХ 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());
рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рд╡реИрд╕реЗ рднреА, рдЪрд▓реЛ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ:
const counter = counts();
- рдЬрдирд░реЗрдЯрд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд╡реЗрд░рд┐рдПрдмрд▓ рдХрд╛рдЙрдВрдЯрд░ рдореЗрдВ рд╕реЗрд╡ рдХрд░реЗрдВред рдЬрдирд░реЗрдЯрд░ рд▓рд┐рдореНрдмреЛ рдореЗрдВ рд╣реИ, рдЬрдирд░реЗрдЯрд░ рдмреЙрдбреА рдореЗрдВ рдХреЛрдИ рдХреЛрдб рдЕрднреА рддрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИредconsole.log(counter.next());
- рдЖрдЙрдЯрдкреБрдЯ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ ( yield
) 1, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж 1 рдХреЛ value
рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ false
done
, рдХреНрдпреЛрдВрдХрд┐ рдЖрдЙрдЯрдкреБрдЯ рд╡рд╣рд╛рдВ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИconsole.log(counter.next());
- рдЕрдм рез!console.log(counter.next());
- рдЕрдм рез! рд╣рдо рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ред рдХреНрдпрд╛ рд╕рдм рдХреБрдЫ рд╕рд╣реА рд╣реИ? рдирд╣реАрдВред рдирд┐рд╖реНрдкрд╛рджрди рдЪрд░рдг yield 3;
рдореЗрдВ рд░реБрдХрд╛ рд╣реБрдЖ рд╣реИ yield 3;
рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдЧрд▓реЗ () рдлрд┐рд░ рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИредconsole.log(counter.next());
- рдЕрдм 4, рдФрд░ рдпрд╣ рд▓реМрдЯрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдм рд╣рдо рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ, рдФрд░ рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИред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);
рдХрд╛рд╣реЗ, рдХреНрдпрд╛ ?! рдПрдХ рдЬрдирд░реЗрдЯрд░ рдореВрд▓реНрдпреЛрдВ рдХреА рдЦрдкрдд рдХрд░рддрд╛ рд╣реИ, рдмрдЬрд╛рдп рдЙрдиреНрд╣реЗрдВ рд╕реНрдкреЙрди рдХрд░рдиреЗ рдХреЗред рдпрд╣ рдХреИрд╕реЗ рд╕рдВрднрд╡ рд╣реИ?
рд░рд╣рд╕реНрдп
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());
рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рдмрдВрдж рдХрд┐рдпрд╛ рдерд╛, рддреЛ рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕рд╛ рдХреБрдЫ рд▓рд┐рдЦрд╛ рд╣реИред рдореЗрдХ рдПрдирдХрд╛рдЙрдВрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдЬрдирд░реЗрдЯрд░ рдХреА рддрд░рд╣ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдЕрдирдВрдд рдЕрдиреБрдХреНрд░рдо рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЬрдирд░реЗрдЯрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕реЗ рд╕реАрдзреЗ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ
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());
рдЗрд╕ рдХреЛрдб рдХреЛ рдЪрд▓рд╛рдиреЗ рд╕реЗ, рдЖрдкрдХреЛ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗред рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ рдирд╛?
рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдЬрдирд░реЗрдЯрд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдкрдХреНрд╖ рдХреЛ рдЫрд╛рдВрдЯрд╛; рдЪрд▓реЛ рдЦрдкрдд рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ?
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИрдВред
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);
рд╕рднреА рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐
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());
рдХреВрд▓ред рдЕрдм рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ!
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());
рд╡рд╛рд╣, рд╣рдордиреЗ рдПрдХ рдкреВрд░реНрдг-рд╕рдВрдкрдиреНрди рдХреЙрд░реБрдЯрд╛рдЗрди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИред
рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдХреБрдЫ рд╣реИред рдЕрдкрд╡рд╛рдж рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ? рдЬрдирд░реЗрдЯрд░ рдХреЗ рдЕрдВрджрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ:
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());
рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ - рдЬреЗрдирд░реЗрдЯрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╡реЗрд╢рдХреЙрдорд░реЗрдб, рд╣рдо рдереНрд░реЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ ()?
рдЖрд╕рд╛рдиреА рд╕реЗ! рддреНрд░реБрдЯрд┐ рд╕рд┐рд░реНрдл рдПрдХ рдФрд░ рдореВрд▓реНрдп рд╣реИред рд╣рдо рдЗрд╕реЗ рдЕрдЧрд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ
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()
- ,
.next()
, {done: false, value: [a Promise]}
- ( ),
.next()
, - , 4
- -
{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/awaitco()
. - , 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
. ? рдпрд╣ рд╕рд╣реА рд╣реИред