Promise.allSettled


рдПрдХреНрдорд╛ 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)); // , -    ,  - - . //        ,   . try { await Promise.all(requests); console.log('  ,    .'); } catch { console.log('-    ,     . .'); } 

Promise.allSettled рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Promise.allSettled рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рд▓рд┐рдЦ тАЛтАЛрд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реА рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛред


 //   ,     API  . Promise.allSettled(requests).finally(() => { console.log('  :    ,   '); removeLoadingIndicator(); }); 

рдХрд╕реНрдЯрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди



рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ


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


  • рдЬрдВрдЧ - futures::join ;
  • рд╕реА # - Task.WhenAll ред рдЖрдк рдпрд╛ рддреЛ рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ / рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ TaskContinuationOptions.OnlyOnFaulted рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  • рдкрд╛рдпрдерди - ALL_COMPLETED рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде ALL_COMPLETED
  • рдЬрд╛рд╡рд╛ - CompletableFuture.allOf

рдЖрдЧреЗ рдХреЗ рдЕрдзреНрдпрдпрди рдХреЗ рд▓рд┐рдП рд╕рд╛рдордЧреНрд░реА



TC39 рдХреА рдмреИрдардХреЛрдВ рд╕реЗ рдорд┐рдирдЯ



рд╡рд┐рдирд┐рд░реНрджреЗрд╢



рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


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


All Articles