рдЗрдирдХрд╛рд░ рдХреЙрд▓рдмреИрдХ: ECMAScript 6 рдореЗрдВ рдЬрдирд░реЗрдЯрд░

рдореИрдВ рд▓рдЧрд╛рддрд╛рд░ рд▓реЛрдЧреЛрдВ рдХреЛ 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); // 0 console.log(seq.next().value); // 1 console.log(seq.next().value); // 1 console.log(seq.next().value); // 2 console.log(seq.next().value); // 3 console.log(seq.next().value); // 5 } run(); 

рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ:
  1. run рдлрд╝рдВрдХреНрд╢рди рдлрд╛рдЗрдмреЛрдиреИрдЪрд┐ рд╕рдВрдЦреНрдпрд╛ рдЬрдирд░реЗрдЯрд░ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд╕рд┐рдВрдЯреИрдХреНрд╕ funtion* рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╣реИ)ред рдПрдХ рдирд┐рдпрдорд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рдХреЙрд▓ рдЙрд╕рдХреЗ рд╢рд░реАрд░ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдирдИ рд╡рд╕реНрддреБ - рдПрдХ рдЬрдирд░реЗрдЯрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
  2. рдЬрдм run рдлрд╝рдВрдХреНрд╢рди next рдЬрдирд░реЗрдЯрд░ рд╡рд┐рдзрд┐ (рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди) рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ yield рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ yield ред
  3. 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); // "a", from the first yield console.log(g.next(10).value); // "b", from the second console.log(g.next(2).value); // 100, the result 

рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдкрд╣рд▓рд╛ рд░рди рд░рди рдкрд░рд┐рдгрд╛рдо рдХреЗ 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 рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬрдирд░реЗрдЯрд░ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИ рдФрд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдХреЛрдб рдкрд░ рд╡рд╛рдкрд╕:
  // ************** // framework code function sync(gen) { var iterable, resume; resume = function(err, retVal) { if (err) iterable.raise(err); iterable.next(retVal); // resume! }; iterable = gen(resume); iterable.next(); } function _get(url, callback) { var x = new XMLHttpRequest(); x.onreadystatechange = function() { if (x.readyState == 4) { callback(null, x.responseText); } }; x.open("GET", url); x.send(); } // **************** // application code sync(function* (resume) { log('foo'); var resp = yield _get("blix.txt", resume); // suspend! log(resp); }); log('bar'); // not part of our generator function's body 

рдХреНрдпрд╛ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХрдВрд╕реЛрд▓ рдореЗрдВ рдХреНрдпрд╛ рджреЗрдЦреЗрдВрдЧреЗ? рд╕рд╣реА рдЙрддреНрддрд░ "рдлреВ", "рдмрд╛рд░" рдФрд░ "рдмреНрд▓рд┐рдХреНрд╕рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ" рд╣реИред рдЬрдирд░реЗрдЯрд░ рдХреЗ рдЕрдВрджрд░ рдХреЛрдб рдХреЛ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░рдЦрдХрд░, рд╣рдо рдЗрд╕реЗ рдирд┐рдпрдорд┐рдд рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдХреА рддрд░рд╣ рдмрдирд╛рддреЗ рд╣реИрдВред рд╣рдо 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); // raise! iterable.next(retVal); }; iterable = gen(resume); iterable.next(); } sync(function* (resume) { try { var x = firstAsync(resume); var y = secondAsync(resume); var z = thirdAsync(resume); // тАж do something with your data } catch (e) { console.log(e); // will catch errors from any of the three calls } }); 

рдЕрдм, рдХрд┐рд╕реА рднреА рддреАрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрдВрджрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдПрдХ рдПрдХрд▓ 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; // step 1 var res3 = yield _get("test3.txt", resume()); // step 2 console.log(res1 + res2); }); 

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░


рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓рдмреИрдХ рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ JavaScript рдкреИрдЯрд░реНрди рд░рд╣реЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдм, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде (рдХреБрдЫ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ JavaScript 1.7 рдФрд░ JavaScript 1.7 рд╕рд╛рде Chrome Canary ) Firefox , рд╕рдм рдХреБрдЫ рдмрджрд▓ рд░рд╣рд╛ рд╣реИред рдирдпрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдирд┐рдпрдВрддреНрд░рдг рдирд┐рд░реНрдорд╛рдг рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╢реИрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдиреЗрд╕реНрдЯреЗрдб рдХреЙрд▓рдмреИрдХ рдХреА рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╢реИрд▓реА рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рддрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдмрд╛рдХреА рд╣реИ рдЬрдм рддрдХ ECMAScript 6 рдорд╛рдирдХ рдХрд▓ рдХреЗ JavaScript рдЗрдВрдЬрди рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

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


All Articles