
рдПрдХреНрдорд╛ TC39 рдХреА 71 рд╡реАрдВ рдмреИрдардХ рдореЗрдВ, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдФрд░ рд╡рд╛рджреЗ рдХреЗ рдЪрд╛рд░ рдкреНрд░рдореБрдЦ рд╕рдВрдпреЛрдЬрдХреЛрдВ рдореЗрдВ рд╕реЗ рддреАрд╕рд░реА, Promise.allSettled рдХреЗ рд╕рдВрджрд░реНрдн рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд▓реЗрдЦрдХ : рдЬреЗрд╕рди рд╡рд┐рд▓рд┐рдпрдореНрд╕ (рдмреАрдмреАрд╕реА), рд░реЙрдмрд░реНрдЯ рдкреБрдорд▓реЗ (рдмреНрд▓реВрдордмрд░реНрдЧ), рдореИрдерд┐рдпрд╛рд╕ рдмрд┐рдиреЗрдВрд╕ (Google)
рдЪреИрдВрдкрд┐рдпрди : рдордерд╛рдпрд╕ рдмрд┐рдиреЗрдВрд╕ (Google)
рдЪрд░рдг : 3
рдкреЙрдбрдХрд╛рд╕реНрдЯ рдХреЗ рдкреНрд░рд╢рдВрд╕рдХреЛрдВ рдХреЗ рд▓рд┐рдП, YouTube рдкрд░ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ ред
рдкрд░рд┐рдЪрдп рдФрд░ рдкреНрд░реЗрд░рдгрд╛
рд╡рд╛рджреЛрдВ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЪрд╛рд░ рдореБрдЦреНрдп рд╕рдВрдпреЛрдЬрдХ рд╣реИрдВ:
Promise.all
ред ES2015ред рдкрд╣рд▓реЗ рдЕрд╕реНрд╡реАрдХреГрдд / рдЕрд╕реНрд╡реАрдХреГрдд рд╡рд╛рджреЗ рдкрд░ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИредPromise.race
ред ES2015ред рдкрд╣рд▓реЗ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рд╣рд▓ / рд╕реБрд▓рдЭрд╛ рд╣реБрдЖ рд╡рд╛рджрд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИредPromise.any
ред рд╕реНрдЯреЗрдЬ 1. рдкрд╣рд▓реЗ рд╕рдВрддреБрд╖реНрдЯ / рдкреВрд░реНрдг рдХрд┐рдП рдЧрдП рд╡рд╛рджреЗ рдкрд░ рдЦрд░рд╛ рдЙрддрд░рддрд╛ рд╣реИредPromise.allSettled
ред рд╕реНрдЯреЗрдЬ 3 тЖТ рд╕реНрдЯреЗрдЬ 4. рдмрдВрдж рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рдЙрди рд╕рднреА рдХреЛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рд╣реИред
рдЗрд╕ рдХреЙрдореНрдмреАрдиреЗрдЯрд░ рдХрд╛ рдореБрдЦреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдХрдИ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдПрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЪрд╛рд╣реЗ рд╡реЗ рд╕рдлрд▓рддрд╛ рдпрд╛ рд╡рд┐рдлрд▓рддрд╛ рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдП рд╣реЛрдВред рд╡рд╛рджреЛрдВ рдХреЗ рдмрд╛рдХреА рд╕рдВрдпреЛрдЬрдХреЛрдВ рдХреЛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ( рд╢реЙрд░реНрдЯ-рд╕рд░реНрдХрд┐рдЯ ), рдЗрдирдкреБрдЯ рдорд╛рдиреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рддреНрдпрд╛рдЧрдХрд░ рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рджреМрдбрд╝ рд╣рд╛рд░ рдЧрдП рд╣реИрдВред Promise.allSettled
рдореЗрдВ рдЕрдиреВрдард╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рд╣рд░ рдХрд┐рд╕реА рд╕реЗ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдХрд┐рд╕рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред
Promise.allSettled
рдПрдХ рд╡рд╛рджрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╡рд╛рджреЛрдВ рдХреЗ рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд╕рднреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡рд╛рджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рджред
рдСрд▓рд╕реЗрдЯрд▓реНрдб рдирд╛рдо рдХрд╣рд╛рдВ рд╕реЗ рдЖрдпрд╛ рд╣реИ?
рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рдХреЛрдИ рд╡рд╛рдж рд▓рдВрдмрд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдЙрд╕рдХрд╛ рдирд┐рдкрдЯрд╛рд░рд╛ ( рдирд┐рдкрдЯрд╛рд░рд╛ ) рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреНред рдЬрдм рд╡рд╣ рдпрд╛ рддреЛ рд╕рдВрддреБрд╖реНрдЯ рд╣реЛрддрд╛ рд╣реИ рдпрд╛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рджреЛ рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХред рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдкреБрд░рд╛рдиреЗ рд░рд╛рдЬреНрдпреЛрдВ рдФрд░ рднрд╛рдЧреНрдп рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред
рдФрд░ рдпрд╣ рднреА, рдпрд╣ рдирд╛рдо, allSettled
, рдореМрдЬреВрджрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рд╕реВрдЪреА рдиреАрдЪреЗ рд╣реЛрдЧреАред
рдЙрджрд╛рд╣рд░рдг
рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЛ рд╡рд╛рджреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЬреНрдЮрд╛рдд рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдореВрд▓реНрдп рд▓реМрдЯрд╛рдПрдВ (рдЬреЛ рдХрд┐ рддрд░реНрдХ рдХреЗ рджреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд╢рд╛рдЦрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдореЗрдВ рднреА рд╣реЛрддрд╛ рд╣реИ)ред
function reflect(promise) { return promise.then( (v) => { return { status: 'fulfilled', value: v }; }, (error) => { return { status: 'rejected', reason: error }; } ); } const promises = [ fetch('index.html'), fetch('https://does-not-exist/') ]; const results = await Promise.all(promises.map(reflect)); const successfulPromises = results.filter(p => p.status === 'fulfilled');
рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдПрдкреАрдЖрдИ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЗрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдмрд┐рдирд╛ reflect
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдмрдирд╛рдиреЗ рдпрд╛ рдЕрд╕реНрдерд╛рдпреА рдЪрд░ рдореЗрдВ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ред рдирдпрд╛ рдПрдкреАрдЖрдИ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
const promises = [ fetch('index.html'), fetch('https://does-not-exist/') ]; const results = await Promise.allSettled(promises); const successfulPromises = results.filter(p => p.status === 'fulfilled');
рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рд╣рдореЗрдВ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЧрдП рд╡рд╛рджреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рд╕рдВрднрд╡рддрдГ рд╣рдореЗрдВ рдЙрди рдХрд╛рд░рдгреЛрдВ рдХреЛ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╣реБрдЖ allSettled
рдпрд╣ рдмрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред
const promises = [ fetch('index.html'), fetch('https://does-not-exist/') ]; const results = await Promise.allSettled(promises); const errors = results .filter(p => p.status === 'rejected') .map(p => p.reason);
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг
рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рд╕рднреА рдЕрдиреБрд░реЛрдз рдкреВрд░реЗ рд╣реЛ рдЧрдП рд╣реИрдВред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЬрдм рдЖрдк рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХреНрд░рдорд┐рдХ рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рд╣рдореЗрд╢рд╛ рдПрдкреАрдЖрдИ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред
const urls = [ ]; const requests = urls.map(x => fetch(x));
Promise.allSettled
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Promise.allSettled
рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рд▓рд┐рдЦ тАЛтАЛрд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реА рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛред
рдХрд╕реНрдЯрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ
рдЗрд╕реА рддрд░рд╣ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рд╡рд┐рднрд┐рдиреНрди рдирд╛рдореЛрдВ рдХреЗ рддрд╣рдд рдореМрдЬреВрдж рд╣реИред рдЪреВрдВрдХрд┐ рдХреЛрдИ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рддрдВрддреНрд░ рдирд╣реАрдВ рд╣реИ рдЬреЛ рддреБрд░рдВрдд рдХрдИ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдКрдкрд░ рд╕реВрдЪреАрдмрджреНрдз рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рдирд╛рдореЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдкрд░ рдпрд╣ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
- рдЬрдВрдЧ -
futures::join
; - рд╕реА # -
Task.WhenAll
ред рдЖрдк рдпрд╛ рддреЛ рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ / рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ TaskContinuationOptions.OnlyOnFaulted
рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред - рдкрд╛рдпрдерди -
ALL_COMPLETED
рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде ALL_COMPLETED
- рдЬрд╛рд╡рд╛ -
CompletableFuture.allOf
рдЖрдЧреЗ рдХреЗ рдЕрдзреНрдпрдпрди рдХреЗ рд▓рд┐рдП рд╕рд╛рдордЧреНрд░реА
TC39 рдХреА рдмреИрдардХреЛрдВ рд╕реЗ рдорд┐рдирдЯ
рд╡рд┐рдирд┐рд░реНрджреЗрд╢
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди