рдореИрдВ рд▓рдЧрд╛рддрд╛рд░ рд▓реЛрдЧреЛрдВ рдХреЛ
JavaScript
рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓рдмреИрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирддрд╛ рд╣реВрдВред рдЗрд╕ рднрд╛рд╖рд╛ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдХреНрд░рдо рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдереЛрдбрд╝рд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ (рдпрд╣ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд┐рд╕реЗ "
рдХреЙрд▓рдмреИрдХ рдирд░реНрдХ " рдпрд╛ "
рдХрдпрд╛рдордд рдХрд╛ рдкрд┐рд░рд╛рдорд┐рдб ") рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реЗ рдирд┐рдкрдЯрд╛ рд╣реИред рдореЗрд░рд╛ рд╕рд╛рдорд╛рдиреНрдп рдЙрддреНрддрд░ рдерд╛ "рдЖрдкрдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╣реЛрдЧрд╛ред" рдЖрдЦрд┐рд░рдХрд╛рд░, рдХреНрдпрд╛ рд╣рдо рд╕рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЛ рд╕рдорд╛рди рджрд┐рдЦрдиреЗ рдФрд░ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ? рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВред
ECMAScript 6
рдбреНрд░рд╛рдлреНрдЯ рдХреА рд╣рд╛рд▓рд┐рдпрд╛ рд╕рдореАрдХреНрд╖рд╛ рд╕реЗ рд╕рдм рдХреБрдЫ рдмрджрд▓ рдЧрдпрд╛, рдЬреЛ рдЬрдирд░реЗрдЯрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ - рднрд╛рд╖рд╛ рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб
JavaScript
рджреЛрдиреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╣рдорд╛рд░реЗ рддрд░реАрдХреЗ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрджрд▓ рджреЗрдЧреАред рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдЕрдкрдиреЗ рдПрдХрдорд╛рддреНрд░
event loop
рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдП рдмрд┐рдирд╛ рдиреЗрд╕реНрдЯреЗрдб рдХреЙрд▓рдмреИрдХ рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЛрдб:
setTimeout(function(){ _get("/something.ajax?greeting", function(err, greeting) { if (err) { console.log(err); throw err; } _get("/else.ajax?who&greeting="+greeting, function(err, who) { if (err) { console.log(err); throw err; } console.log(greeting+" "+who); }); }); }, 1000);
рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
sync(function* (resume) { try (e) { yield setTimeout(resume, 1000); var greeting = yield _get('/something.ajax?greeting', resume) var who = yield _get('/else.ajax?who&greeting=' + greeting, resume) console.log(greeting + ' ' + who) } catch (e) { console.log(e); throw e; } });
рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рд╣реИ рдирд╛? рдХреЗрдВрджреНрд░реАрдХреГрдд рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдирд┐рд╖реНрдкрд╛рджрди рдЖрджреЗрд╢ред
рдЙрд╣, рдИрд╕реАрдПрдордПрд╕реНрдХреНрд░рд┐рдкреНрдЯ 6?
рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдЙрджрд╛рд╣рд░рдг
Chrome Canary 33.0.1716.0
рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг, рдЬрд╣рд╛рдВ
XHR
, рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде,
Node.js
рдореЗрдВ -
--harmony
рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЪреВрдВрдХрд┐ рд╕рдВрд╕реНрдХрд░рдг 0.11,
рд▓рдЧрднрдЧред рдЕрдиреБрд╡рд╛рджред )ред
JavaScript 1.7+
рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЬрдирд░реЗрдЯрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
ECMAScript 6
рдорд╕реМрджреЗ рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ
Firefox
рдореЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗред рдпрджрд┐ рдЖрдк
Canary
рдореЗрдВ рдЗрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдпрд╣рд╛рдВ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред
ES6 рдЬрдирд░реЗрдЯрд░
рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐
ES6
рдЬрдирд░реЗрдЯрд░ рдХреНрдпрд╛ рд╣реИрдВ рдФрд░ рд╡реЗ рдЖрдкрдХреЛ рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
ECMAScript 6
рдорд╕реМрджреЗ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЬреЗрдирд░реЗрдЯрд░ "рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХреЗ рдХреЛрд░рдЖрдЙрдЯреНрд╕ рд╣реИрдВ, рдЬреЛ рдРрд╕реА рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВ рдЬреЛ рд▓рдВрдмрд┐рдд рдирд┐рд╖реНрдкрд╛рджрди рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рд╕рдВрд▓рдЧреНрди рдХрд░рддреА рд╣реИрдВ"ред рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ, рдЬрдирд░реЗрдЯрд░ рд╡реЗ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ рдЕрдкрдиреЗ рдирд┐рд╖реНрдкрд╛рджрди (
yield
рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдХреЛ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреА
next
рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЙрд╕реА рд╕реНрдерд╛рди рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред
JavaScript
рдЕрднреА рднреА рдПрдХ рд╕рдордп рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдм рдЬрдирд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмреАрдЪ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕рдВрджрд░реНрдн рдХреЛ рдХреБрдЫ рдФрд░ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЬреЗрдирд░реЗрдЯрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рд╡реЗ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдзрд╛рд░рд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИред
рдорд╛рдореВрд▓реА рдЗрдЯрд░реЗрдЯрд░
рдЕрдм рдЬрдм рд╣рдо рдереЛрдбрд╝рд╛ рд╕рдордЭ рдЧрдП рд╣реИрдВ, рддреЛ рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред рд╣рдо рд╕реНрдЯреЙрдк рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ / рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд▓рд┐рдЦреЗрдВрдЧреЗред
function* fibonacci() { var a = 0, b = 1, c = 0; while (true) { yield a; c = a; a = b; b = c + b; } } function run() { var seq = fibonacci(); console.log(seq.next().value);
рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ:
run
рдлрд╝рдВрдХреНрд╢рди рдлрд╛рдЗрдмреЛрдиреИрдЪрд┐ рд╕рдВрдЦреНрдпрд╛ рдЬрдирд░реЗрдЯрд░ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд╕рд┐рдВрдЯреИрдХреНрд╕ funtion*
рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╣реИ)ред рдПрдХ рдирд┐рдпрдорд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рдХреЙрд▓ рдЙрд╕рдХреЗ рд╢рд░реАрд░ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдирдИ рд╡рд╕реНрддреБ - рдПрдХ рдЬрдирд░реЗрдЯрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИред- рдЬрдм
run
рдлрд╝рдВрдХреНрд╢рди next
рдЬрдирд░реЗрдЯрд░ рд╡рд┐рдзрд┐ (рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди) рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ yield
рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ yield
ред yield
рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдЬрдирд░реЗрдЯрд░ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ yield
рдмрд╛рдж рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдирд┐рд╖реНрдкрд╛рджрди рдкрд░рд┐рдгрд╛рдо рдХреЗ value
рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореВрд▓реНрдп ( yield
рд▓рд┐рдП a
рд╕рдВрдЪрд╛рд▓рди) рдмрд╛рд╣рд░реА рд░реВрдк рд╕реЗ рд╕реБрд▓рдн рд╣реЛрдЧрд╛ред
рдЕрдЧрд▓реА рдмрд╛рд░ рдЬрдм next
рд╡рд┐рдзрд┐ рдХреЛ рдЬрдирд░реЗрдЯрд░ рдкрд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреЛрдб рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рд░рд╣рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕реЗ рдпрд╣ рдкрд┐рдЫрд▓реА yield
рдкрд░ рд░реБрдХ рдЧрдпрд╛ рдерд╛ред
рдЖрдк рд╢рд╛рдпрдж рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЬрдирд░реЗрдЯрд░ рдХрднреА
while
рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЬрд╛рдПрдЧрд╛ред рдирд╣реАрдВ, рдпрд╣ рд▓реВрдк рдХреЗ рдЕрдВрджрд░ рддрдм рддрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдХреЛрдИ рдЗрд╕рдХреА
next
рд╡рд┐рдзрд┐ рдирд╣реАрдВ рдХрд╣рддрд╛ред
рдЯреНрд░реИрдХ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди
рдЬреИрд╕рд╛ рдХрд┐ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ,
yield
рдмрд╛рдж рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рд╕реНрдерд┐рдд рдХреЛрдб рдХреЛ рддрдм рддрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдЬрдирд░реЗрдЯрд░ рдЬрд╛рд░реА рди рд╣реЛред рдЬрдирд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИ, рдЬрд┐рд╕реЗ рдЙрд╕
yield
рд▓рд┐рдП рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд┐рд╕ рдкрд░ рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдкрд┐рдЫрд▓рд╛ рдирд┐рд╖реНрдкрд╛рджрди рдмрд╛рдзрд┐рдд рдерд╛ред
function* powGenerator() { var result = Math.pow(yield "a", yield "b"); return result; } var g = powGenerator(); console.log(g.next().value);
рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдкрд╣рд▓рд╛ рд░рди рд░рди рдкрд░рд┐рдгрд╛рдо рдХреЗ
value
рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ
"a"
рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рд╣рдо рдЬрдирд░реЗрдЯрд░ рдХреЛ
10
рдХрд╛ рдорд╛рди рдкрд╛рд╕ рдХрд░рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред рдЬреЛ рдХреБрдЫ рд╣реЛрддрд╛ рд╣реИ, рдЙрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
function* powGenerator() { var result = Math.pow(----10----, yield "b"); return result; }
рдлрд┐рд░ рдЬрдирд░реЗрдЯрд░ рджреВрд╕рд░реА
yield
рддрдХ рдкрд╣реБрдВрдЪрддрд╛
yield
рдФрд░ рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдлрд┐рд░ рд╕реЗ рд░реЛрдХ рджреЗрддрд╛ рд╣реИред рдорд╛рди
"b"
рд▓реМрдЯреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ред рдЕрдВрдд рдореЗрдВ, рд╣рдо рдлрд┐рд░ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ,
2
рдХреЛ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░ рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди:
function* powGenerator() { var result = Math.pow(----10----, ----2----); return result; }
рдЙрд╕рдХреЗ рдмрд╛рдж,
pow
рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЬрдирд░реЗрдЯрд░
result
рдЪрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдирдХрд▓реА рд╕рд┐рдВрдХ: рдмреНрд▓реЙрдХрд┐рдВрдЧ Ajax
рдХрдИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд╕рд╛рде рдлрд┐рдмреЛрдирд╛рдЪреА рдЕрдиреБрдХреНрд░рдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдФрд░ рдЧрдгрд┐рдд рдХрд╛рд░реНрдп рджрд┐рд▓рдЪрд╕реНрдк рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЖрдкрдХреЛ рдЕрдкрдиреЗ
JavaScript
рдХреЛрдб рдореЗрдВ рдХреЙрд▓рдмреИрдХ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рджрд┐рдЦрд╛рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ, рд╣рдо рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ,
sync
рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдпрд╣
resume
рд╕реЗ
resume
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд░рдХреЗ рдПрдХ рдЬрдирд░реЗрдЯрд░ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕ рдкрд░
next
рд╡рд┐рдзрд┐ рдХрд╣рддрд╛ рд╣реИред рдЬрдм рдПрдХ рдЬрдирд░реЗрдЯрд░ рдХреЛ рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдХреЙрд▓рдмреИрдХ рдХреЗ рд░реВрдк рдореЗрдВ
resume
рдХрд░рддрд╛ рд╣реИ рдФрд░
yield
рдХрд░рддрд╛
yield
ред рдЬрдм рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрд▓
resume
, рддреЛ рдпрд╣
next
рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬрдирд░реЗрдЯрд░ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИ рдФрд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдХреЛрдб рдкрд░ рд╡рд╛рдкрд╕:
рдХреНрдпрд╛ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХрдВрд╕реЛрд▓ рдореЗрдВ рдХреНрдпрд╛ рджреЗрдЦреЗрдВрдЧреЗ? рд╕рд╣реА рдЙрддреНрддрд░ "рдлреВ", "рдмрд╛рд░" рдФрд░ "рдмреНрд▓рд┐рдХреНрд╕рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ" рд╣реИред рдЬрдирд░реЗрдЯрд░ рдХреЗ рдЕрдВрджрд░ рдХреЛрдб рдХреЛ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░рдЦрдХрд░, рд╣рдо рдЗрд╕реЗ рдирд┐рдпрдорд┐рдд рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдХреА рддрд░рд╣ рдмрдирд╛рддреЗ рд╣реИрдВред рд╣рдо
event loop
рдереНрд░реЗрдб рдХреЛ рдмреНрд▓реЙрдХ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ; рд╣рдо рдЬрдирд░реЗрдЯрд░ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ рдФрд░
next
рдХреЙрд▓ рдХреЗ рдмрд╛рдж рдЖрдЧреЗ рд╕реНрдерд┐рдд рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред рднрд╡рд┐рд╖реНрдп рдХреА рдХреЙрд▓рдмреИрдХ, рдЬрд┐рд╕реЗ рдПрдХ рдФрд░ рдЯрд┐рдХ рдкрд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╣рдорд╛рд░реЗ рдЬрдирд░реЗрдЯрд░ рдХреЛ рдЬрд╛рд░реА рд░рдЦреЗрдЧрд╛, рдЗрд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рдорд╛рди рдкрд╛рд╕ рдХрд░реЗрдЧрд╛ред
рдХреЗрдВрджреНрд░реАрдХреГрдд рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ
рдХрдИ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓рдмреИрдХ рдХреЗ рдЕрдВрджрд░ рдХреЗрдВрджреНрд░реАрдХреГрдд рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдПрдХ рджрд░реНрдж рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
try { firstAsync(function(err, a) { if (err) { console.log(err); throw err; } secondAsync(function(err, b) { if (err) { console.log(err); throw err; } thirdAsync(function(err, c) { if (err) { console.log(err); throw err; } callback(a, b, c); }); }); }); } catch (e) { console.log(e); }
рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг
catch
рдХреЛ рдХрднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдХреЙрд▓рдмреИрдХ рдирд┐рд╖реНрдкрд╛рджрди
event loop
рдПрдХ рдЕрдиреНрдп рдЯрд┐рдХ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рд╕реНрдерд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рджреЛрд╣рд░рд╛рдпрд╛ рдЪреЗрдХ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░
async
рдЬреИрд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреБрдЫ рдЕрдиреБрд▓рдЧреНрдирдХреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдЪреНрдЪ рдЖрджреЗрд╢ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ
Node.js
рд╕рдореНрдореЗрд▓рди рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВрдбрд▓рд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЬрдирд░реЗрдЯрд░ рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛:
function sync(gen) { var iterable, resume; resume = function(err, retVal) { if (err) iterable.raise(err);
рдЕрдм, рдХрд┐рд╕реА рднреА рддреАрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрдВрджрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдПрдХ рдПрдХрд▓
catch
рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдЬреЛ рдЕрдкрд╡рд╛рдж рддреАрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдореЗрдВ рд╣реБрдЖ, рд╡рд╣ рдмрд╛рдж рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛ред рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ред
рдПрдХ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рдиред
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЬрдирд░реЗрдЯрд░ рдХреЛрдб рдХреЛ рдКрдкрд░ рд╕реЗ рдиреАрдЪреЗ рддрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдИ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
genny
рдФрд░
gen-run
рдЬреИрд╕реА
genny
рддрд░рд╣ рдХреА API рджреЗрддреА рд╣реИрдВ: рд╡реЗ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдЬрд╛рд░реА рд░рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрдИ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░
genny
:
genny.run(function* (resume) { _get("test1.txt", resume()); _get("test2.txt", resume()); var res1 = yield resume, res2 = yield resume;
рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓рдмреИрдХ рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ
JavaScript
рдкреИрдЯрд░реНрди рд░рд╣реЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдм, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде (рдХреБрдЫ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ
JavaScript 1.7
рдФрд░
JavaScript 1.7
рд╕рд╛рде
Chrome Canary
)
Firefox
, рд╕рдм рдХреБрдЫ рдмрджрд▓ рд░рд╣рд╛ рд╣реИред рдирдпрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдирд┐рдпрдВрддреНрд░рдг рдирд┐рд░реНрдорд╛рдг рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╢реИрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдиреЗрд╕реНрдЯреЗрдб рдХреЙрд▓рдмреИрдХ рдХреА рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╢реИрд▓реА рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рддрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдмрд╛рдХреА рд╣реИ рдЬрдм рддрдХ
ECMAScript 6
рдорд╛рдирдХ рдХрд▓ рдХреЗ
JavaScript
рдЗрдВрдЬрди рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред