рдкрд╡рд┐рддреНрд░рд╛ 2019: рд╕реЗрдорд░рд╢ рд╕реЗ рднрд╛рдЧ (рднрд╛рдЧ 2)



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

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

рдХрд╛рд░реНрдп 2 ~ рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛


рдпрд╣ рдорд╛рди рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдХреЛрдб рддреАрди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдХрдВрд╕реЛрд▓ рдХреЛ рдЙрддреНрддрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдФрд░ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдЧрд╛, рдФрд░ рдлрд┐рд░ "рдХрд┐рдпрд╛ рдЧрдпрд╛"ред рд▓реЗрдХрд┐рди рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЧрдпрд╛ ... рд╕реНрдерд┐рддрд┐ рдХреЛ рдареАрдХ рдХрд░реЗрдВред

;(function() { let iter = { [Symbol.iterator]: function* iterf() { let fs = ['/1', '/2', '/3']; for (const req in fs) { yield fetch(req); } } }; for (const res of iter) { console.log(res); } console.log('done'); })(); 

рд╢реЛрдз рд╕рдорд╕реНрдпрд╛


рд╣рдорд╛рд░реЗ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реИ? рдпрд╣ рдПрдХ iterable iter рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рдкреНрд░рддреАрдХ рд╣реИ ред рдЬрдирд░реЗрдЯрд░ рдкреНрд░рддреАрдХ рдПрдХ рдЬрдирд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдПрдХ рд╕рд░рдгреА fs рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рддрддреНрд╡реЛрдВ рдХреЛ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рднреНрд░реВрдг рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЙрдкрдЬ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ ред рднреНрд░реВрдг рдХреЗ рдХрд╛рд░реНрдп рдХреНрдпрд╛ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддреЗ рд╣реИрдВ? рдПрдлрдПрд╕ рд╕рд░рдгреА рдХреЗ рд╕рднреА рддрддреНрд╡ рдХреНрд░рдорд╢рдГ рд╕рдВрдЦреНрдпрд╛ 1, 2 рдФрд░ 3 рдХреЗ рд╕рд╛рде рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкрде рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдкреВрд░рд╛ URL рд╕реНрдерд╛рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдЧрд▓реЗ рдирдВрдмрд░ рдХреЗ рд╕рд╛рде:

GET https://www.example.com/1

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

Promise {pending}
Promise {pending}
Promise {pending}
done

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрд╛рд░реНрдп рдЗрдиреНрд╣реАрдВ рд╡рд╛рджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рд╣реИ


рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░ Promise.all рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: рдЗрд╕реЗ рд╣рдорд╛рд░реА рдЪрд▓рдиреЗ рдпреЛрдЧреНрдп рд╡рд╕реНрддреБ рджреЗрдВ, рдлрд┐рд░ рдХрдВрд╕реЛрд▓ рдХреЛ "рдХрд┐рдпрд╛"ред рд▓реЗрдХрд┐рди рд╡рд╣ рд╣рдореЗрдВ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди (рдЬреИрд╕рд╛ рдХрд┐ рд╢рд░реНрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЖрд╡рд╢реНрдпрдХ рд╣реИ) рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдмрд╕ рдЙрди рд╕рднреА рдХреЛ рднреЗрдЬреЗрдВ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдХрд▓реНрдк рд╕реЗ рдкрд╣рд▓реЗ рдЕрдВрддрд┐рдо рдЙрддреНрддрд░ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред

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

 for (const res of iter) { console.log(await res); } 

рдЕрдВрдд рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ "рдХрд┐рдП рдЬрд╛рдиреЗ" рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП , рдЖрдкрдХреЛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХреЛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 ;(async function() { let iter = { /* ... */ }; for (const res of iter) { console.log(await res); } console.log('done'); })(); 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдорд╕реНрдпрд╛ рдкрд╣рд▓реЗ рд╣реА рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИ (рд▓рдЧрднрдЧ):

GET 1st
Response 1st
GET 2nd
Response 2nd
GET 3rd
Response 3rd
done

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


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

 for await (const res of iter) { console.log(res); } 

рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░реЗрдЧрд╛! рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ:

рд╣рдо рдкреБрдирд░рд╛рд╡реГрддрд┐ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рднрд┐рдиреНрдирддрд╛ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВ рдЬреЛ async iterable рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд░рддрд╛ рд╣реИред рдХреЗрд╡рд▓ Async рдлрд╝рдВрдХреНрд╢рди рдФрд░ Async рдЬрдирд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП Async рдСрдлрд╝-рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ

рдпрд╣реА рд╣реИ, рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ рди рдХреЗрд╡рд▓ рдЪрд▓рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдмрд▓реНрдХрд┐ рдирдП рдЬрд╛рдиреЗ-рдорд╛рдиреЗ рдкреНрд░рддреАрдХ Symbol.asyncIterator рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ "asyncIterable" рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЬрдирд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди:

 let iter = { [Symbol.asyncIterator]: async function* iterf() { let fs = ['/1', '/2', '/3']; for (const req in fs) { yield await fetch(req); } } }; 

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

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

рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдорд╕реМрджреЗ рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдзреБрдирд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ (рдПрдЬ рдХреЛ рдЫреЛрдбрд╝рдХрд░) рдФрд░ Node.js рджреНрд╡рд╛рд░рд╛ 10.x рд╕реЗ рд╕рдорд░реНрдерд┐рдд рд╣реИред рдпрджрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреЛ рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдк рд╣рдореЗрд╢рд╛ рд╡рд╛рджреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЫреЛрдЯреА рдкреЙрд▓реАрдлрд╛рдЗрд▓ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд▓рд┐рдП

 const chain = (promises, callback) => new Promise(resolve => function next(it) { let i = it.next(); i.done ? resolve() : i.value.then(res => { callback(res); next(it); }); }(promises[Symbol.iterator]()) ); ;(async function() { let iter = { /* iterable */ }; await chain(iter, console.log); console.log('done'); })(); 

рдЗрд╕ рддрд░рд╣ рдФрд░ рдЗрд╕ рддрд░реАрдХреЗ рд╕реЗ, рд╣рдордиреЗ рдмрджрд▓реЗ рдореЗрдВ рдЕрдиреБрд░реЛрдз рдФрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдВ рднреЗрдЬ рджреАрдВред рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рдПрдХ рдФрд░ рдЫреЛрдЯреА рд▓реЗрдХрд┐рди рдХрд╖реНрдЯрдкреНрд░рдж рд╕рдорд╕реНрдпрд╛ рд╣реИ ...

рдорд╛рдЗрдВрдбрдлреБрд▓рдиреЗрд╕ рдЯреЗрд╕реНрдЯ


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

GET https://www.example.com/0
GET https://www.example.com/1
GET https://www.example.com/2

рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реА рд╕рдВрдЦреНрдпрд╛ 1, 2, 3 рд╣реИред рдорд╛рдиреЛ рдХрд┐ рдЧрд┐рд░рд╛рд╡рдЯ рдЖрдИ рдереАред рдРрд╕рд╛ рдХреНрдпреЛрдВ? рдмрд╕ рдХрд╛рд░реНрдп рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдпрд╣рд╛рдВ:

 let fs = ['/1', '/2', '/3']; for (const req in fs) { yield fetch(req); } 

рдпрд╣рд╛рдВ рдПрдХ рдлреЙрд░-рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЬреЛ рдПрд░реЗ рд╡реИрд▓реНрдпреВ рдХреЗ рдмрдЬрд╛рдп рдЕрдкрдиреЗ рдПрдиреНрдпреВрдорд░реЗрдЯреЗрдб рдЧреБрдгреЛрдВ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░ рджреЗрддрд╛ рд╣реИ: рдФрд░ рдпреЗ 0 рд╕реЗ 2 рддрдХ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЗ рд╕реВрдЪрдХ рд╣реИрдВред рднреНрд░реВрдг рдлрд╝рдВрдХреНрд╢рди рдЕрднреА рднреА рдЙрдиреНрд╣реЗрдВ рддрд╛рд░ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рд╕реНрд▓реИрд╢ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд╡рдЬреВрдж (рдпрд╣ рдЕрдм рдкрде рдирд╣реАрдВ рд╣реИ ), рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рд╡рд░реНрддрдорд╛рди рдкреГрд╖реНрда рдХрд╛ URLред рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреЛрдЯрд┐рд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рджреЛ рд╡рд┐рдХрд▓реНрдк:

 let fs = ['/1', '/2', '/3']; for (const req of fs) { yield fetch(req); } let fs = ['/1', '/2', '/3']; for (const req in fs) { yield fetch(fs[req]); } 

рдкрд╣рд▓реЗ рдореЗрдВ, рд╣рдордиреЗ рд╕рд░рдгреА рдХреЗ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рджреВрд╕рд░реЗ рдореЗрдВ - рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рд╕рд░рдгреА рддрддреНрд╡ рддрдХ рдкрд╣реБрдВрдЪред

рдкреНрд░реЗрд░рдгрд╛


рд╣рдордиреЗ 3 рд╕рдорд╛рдзрд╛рдиреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛: 1) рд╢рд░реАрд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, 2) рдлреЙрд░- рд╡реЗрдЯ -рдСрдл рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ , рдФрд░ 3) рд╣рдорд╛рд░реЗ рдкреЙрд▓реАрдлрд╛рдЗрд▓ (рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрд╛рд░реНрдп, рдкрд╛рдЗрдк рдкрд╛рдЗрдкрд▓рд╛рдЗрди, рдЖрджрд┐) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред рдпрд╣ рдЙрддреНрд╕реБрдХ рд╣реИ рдХрд┐ рдЗрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдиреЗ рд╕рдореНрдореЗрд▓рди рдХреЗ рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдХреЛ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдХреЛрдИ рднреА рдкрд╕рдВрджреАрджрд╛ рдкрд╕рдВрджреАрджрд╛ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реБрдЖред рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ, рдРрд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрд░рдПрдХреНрд╕рдЬреЗрдПрд╕ ) рдЖрдорддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рдХреГрддрд┐ рд╡рд╛рд▓реА рднрд╛рд╖рд╛ рдХреА рдЖрдзреБрдирд┐рдХ рджреЗрд╢реА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╛рдж рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИред

рд▓рдЧрднрдЧ рдЖрдзреЗ рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдиреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рд╕реВрдЪреА рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдиреЛрдЯрд┐рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛, рдЬреЛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЕрд╡рд▓реЛрдХрди рднреА рд╣реИред рдПрдХ рдЧреИрд░-рддреБрдЪреНрдЫ рд▓реЗрдХрд┐рди рд╕реНрдкрд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрд╕ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдЯреНрд░рд┐рдлрд╝рд▓ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рдВрднрд╛рд╡рд┐рдд рдЧрдВрднреАрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рдеред

рд╕рдорд╕реНрдпрд╛ 3 ~ рдХрд╛рд░рдХ 19


2019 рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд░рд┐рдХреЙрд░реНрдб рдореЗрдВ рдХрд┐рддрдиреА рдмрд╛рд░! (2019 рд╕реЗ рдЧреБрдЯрдмрд╛рдЬреА) рд╕рдВрдЦреНрдпрд╛ 19 рд╣реЛрддреА рд╣реИ? рдЙрддреНрддрд░ рдХреЗ рд╕рд╛рде, рдПрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░реЗрдВред

рд╢реЛрдз рд╕рдорд╕реНрдпрд╛


рд╕рдорд╕реНрдпрд╛ рд╕рддрд╣ рдкрд░ рд╣реИ: рд╣рдореЗрдВ рдЗрд╕реЗ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд░рд┐рдХреЙрд░реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ "19" рдХреЗ рд╕рд╛рде рдШрдЯрд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рднреА рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ред рдирдВрдмрд░ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рдЗрдиреНрдлрд┐рдирд┐рдЯреА (170 рдХреЗ рдмрд╛рдж) рдореЗрдВ рднрд╛рдЧ рдЧрдП рдФрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░реВрдк float64 рдХреЗрд╡рд▓ 15-17 рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдЯреАрдХрддрд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рди рдХреЗрд╡рд▓ рдПрдХ рдкреВрд░реНрдг, рдмрд▓реНрдХрд┐ рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдПрдХ рд╕рдЯреАрдХ рд░рд┐рдХреЙрд░реНрдб рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореБрдЦреНрдп рдХрдард┐рдирд╛рдИ рдЗрд╕ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рдВрдЪрдп рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдирд╛ рд╣реИред

рдмрдбрд╝рд╛ рдкреВрд░реНрдгрд╛рдВрдХ


рдпрджрд┐ рдЖрдк рднрд╛рд╖рд╛ рдХреЗ рдирд╡рд╛рдЪрд╛рд░реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрд╛рд░реНрдп рдХреЗрд╡рд▓ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдкреНрд░рдХрд╛рд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрдЬрд╛рдп , рдЖрдк рдирдП рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ BigInt (рдЪрд░рдг 3) , рдЬреЛ рдЖрдкрдХреЛ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рд╕рдЯреАрдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред String.prototyp.split рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлреИрдХреНрдЯрд░рд┐рдпрд▓ рдХреА рдЧрдгрдирд╛ рдФрд░ рдореИрдЪ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рд╕рд┐рдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде , рдкрд╣рд▓рд╛ рд╕рдорд╛рдзрд╛рди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 const fn = n => n > 1n ? n * fn(n - 1n) : 1n; console.log(fn(2019n).toString().split('19').length - 1); // 50 

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

 console.log([...Array(2019)].reduce((p, _, i) => p * BigInt(i + 1), 1n).toString().match(/19/g).length); // 50 

рдпрд╣ рдПрдХ рд▓рдВрдмреА рд▓рдВрдмреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдзрд╛рд░рдгрд╛ рднреНрд░рд╛рдордХ рд╣реИред рдпрджрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рд╣рдЬрд╛рд░ рдЧреБрдгрд╛ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЦрд░реНрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреНрд░реЛрдо рдореЗрдВ i5-4590 3.30GHz рдкрд░, рд╕рдорд╕реНрдпрд╛ 4-5ms (!) рдореЗрдВ рдФрд╕рдд рд░реВрдк рд╕реЗ рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИред

рдПрдХ рдЧрдгрдирд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдореИрдЪ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рд╡реИрд╢реНрд╡рд┐рдХ рдЦреЛрдЬ рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ String.prototyp.match рд╣реИ: / 19 / g ред

рдмрдбрд╝рд╛ рдЕрдВрдХрдЧрдгрд┐рдд


рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рдмрд┐рдЧрдЖрдИрдВрдЯ (рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рднреА) рдирд╣реАрдВ рд╣реИ? рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рд▓рдВрдмреА рдЕрдВрдХрдЧрдгрд┐рдд рдЦреБрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рдЫреЛрдЯреЗ рд╕реЗ рдмрдбрд╝реЗ рдХреЛ рдЧреБрдгрд╛ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░реЗрдВ (рд╣рдо рд╕рдВрдЦреНрдпрд╛ 1 рд╕реЗ 2019 рддрдХ рдЧреБрдгрд╛ рдХрд░реЗрдВ)ред рд╣рдо рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЧреБрдгрд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓рд╛рдЗрди рдореЗрдВ:

 /** * @param {string} big * @param {number} int * @returns {string} */ const mult = (big, int) => { let res = '', carry = 0; for (let i = big.length - 1; i >= 0; i -= 1) { let prod = big[i] * int + carry; res = prod % 10 + res; carry = prod / 10 | 0; } return (carry || '') + res; } console.log([...Array(2019)].reduce((p, _, i) => mult(p, i + 1), '1').match(/19/g).length); // 50 

рдпрд╣рд╛рдБ рд╣рдо рдХреЗрд╡рд▓ рдкрдВрдХреНрддрд┐ рдХреЗ рдЕрдВрдд рд╕реЗ рд╢реБрд░реБрдЖрдд рддрдХ рдмрд┐рдЯреНрд╕ рдореЗрдВ рд╕реНрддрдВрдн рдХреЛ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдореЗрдВ рд╕реНрдХреВрд▓ рдореЗрдВ рдкрдврд╝рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рд╕рдорд╛рдзрд╛рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рдЧрднрдЧ 170ms рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

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

 /** * @param {Array<number>} big * @param {number} int * @param {number} digits * @returns {Array<number>} */ const mult = (big, int, digits = 1) => { let res = [], carry = 0, div = 10 ** digits; for (let i = big.length - 1; i >= 0 || carry; i -= 1) { let prod = (i < 0 ? 0 : big[i] * int) + carry; res.push(prod % div); carry = prod / div | 0; } return res.reverse(); } 

рдпрд╣рд╛рдВ, рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдПрдХ рд╕рд░рдгреА рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рд╕рдВрдЦреНрдпрд╛ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╕рдВрдЦреНрдпрд╛ рд░рд┐рдХреЙрд░реНрдб рд╕реЗ рдЕрдВрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдВрдХреЛрдВ рдХреЗ рд╕рд╛рде 2016201720182019 = 3 рдХреЛ рдирд┐рдореНрди рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛:

'2|016|201|720|182|019' => [2,16,201,720,182,19]

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

 const factor = (n, digits = 1) => [...Array(n)].reduce((p, _, i) => mult(p, i + 1, digits), [1]) .map(String) .map(el => '0'.repeat(digits - el.length) + el) .join('') .replace(/^0+/, ''); console.log(factor(2019, 3).match(/19/g).length); // 50 

рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ "рдШреБрдЯрдиреЗ рдХреА рд▓рдВрдмрд╛рдИ" рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рддреЗрдЬреА рд╕реЗ рдирд┐рдХрд▓рд╛, рдФрд░ рдЕрдВрдХреЛрдВ = 1 рдХреЗ рд╕рд╛рде рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 90 рдХреЗ рдФрд╕рдд рдкрд░ рдЬрд╡рд╛рдм рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рдЕрдВрдХ = 3 рдореЗрдВ 35ms, рдЕрдВрдХ = 6 рдореЗрдВ рдХреЗрд╡рд▓ 20msред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЕрдВрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝ рд░рд╣реА рд╣реИ, рд╣рдо рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдХреЗ рдирд┐рдХрдЯ рдЖ рд░рд╣реЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рд╕рдВрдЦреНрдпрд╛ "рд╣реВрдб рдХреЗ рдиреАрдЪреЗ" рд╕реЗ рдЧреБрдгрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд╕реБрд░рдХреНрд╖рд┐рдд MAX_SAFE_INTEGER рдХреЗ рдмрд╛рд╣рд░ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рдпрд╣рд╛рдВ рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ ред рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдзрд┐рдХрддрдо рдЕрдВрдХреЛрдВ рдХрд╛ рдореВрд▓реНрдп рдХреНрдпрд╛ рд╣реИ?

рдкрд░рд┐рдгрд╛рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рд╕рдВрдХреЗрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, BigInt рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЬрд▓реНрджреА рд╣реИ:



рдкреНрд░реЗрд░рдгрд╛


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

рдзрдиреНрдпрд╡рд╛рдж


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

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


All Articles