рдбрд╛рд░реНрдЯ 2. рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ: рд╡рд╛рдпрджрд╛

рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ: рд╡рд╛рдпрджрд╛


рд╕рд╛рдордЧреНрд░реА



рдХреНрдпрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ:


  • рдбрд╛рд░реНрдЯ рдореЗрдВ рдХреЛрдб рдПрдХ рдПрдХрд▓ рдереНрд░реЗрдб ( рдиреЛрдЯ рдереНрд░реЗрдб - рдереНрд░реЗрдб ) рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИред
  • рдХреЛрдб рдХреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдереНрд░реЗрдб (рдмреНрд▓реЙрдХ) рд▓реЗрдиреЗ рдХреЗ рдХрд╛рд░рдг, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдлреНрд░реАрдЬ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
  • Future ( futures ) рд╡рд╕реНрддреБрдПрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреА рд╣реИрдВ - рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдпрд╛ I / O, рдЬреЛ рдмрд╛рдж рдореЗрдВ рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
  • рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдирд┐рд▓рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлрд╝рдВрдХреНрд╢рди (рдпрд╛ then() рдЬрдм Future рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ then() рдореЗрдВ await рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
  • рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ catchError() try-catch рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди (рдпрд╛ catchError() рдЙрдкрдпреЛрдЧ try-catch catchError() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
  • рдПрдХ рд╕рд╛рде рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрд▓рдЧ (рдпрд╛ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХрд░реНрддрд╛) рдмрдирд╛рдПрдВред

рдбрд╛рд░реНрдЯ рдореЗрдВ рдХреЛрдб рдПрдХ рдПрдХрд▓ рдирд┐рд╖реНрдкрд╛рджрди рдереНрд░реЗрдб рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдб рд▓рдВрдмреА рдЧрдгрдирд╛ рдХреЗ рд╕рд╛рде рд╡реНрдпрд╕реНрдд рд╣реИ рдпрд╛ I / O рдСрдкрд░реЗрд╢рди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдкреВрд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд░реЛрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


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


рдПрдХ рдиреЛрдЯ


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

рдХреЛрдб рдмреНрд▓реЙрдХ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП, рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рдЖрдЗрд╕реЛрд▓реЗрдЯреНрд╕ рдореЗрдВ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред (рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрдЗрд╕реЛрд▓реЗрдЯреНрд╕ рдХреЗ рдмрдЬрд╛рдп рд╢реНрд░рдорд┐рдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред) рдЖрдорддреМрд░ рдкрд░, рдЖрдЗрд╕реЛрд▓реЗрдЯреНрд╕ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛрд░ рдкрд░ рдЪрд▓рддрд╛ рд╣реИред рдЖрдЗрд╕реЛрд▓реЗрдЯреНрд╕ рд╕реНрдореГрддрд┐ рдХреЛ рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╡реЗ рдмрд╛рддрдЪреАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╡рд╣ рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рд╡рд┐рд╖рдп рдореЗрдВ рдЧреЛрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрд▓рдЧрд╛рд╡ рдпрд╛ рд╢реНрд░рдорд┐рдХреЛрдВ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬ рджреЗрдЦреЗрдВред

рдкрд░рд┐рдЪрдп


рдЖрдЗрдП рдХреЛрдб рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦреЗрдВ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ "рдлреНрд░реАрдЬ" рдХрд░ рд╕рдХрддрд╛ рд╣реИ:


 // Synchronous code void printDailyNewsDigest() { var newsDigest = gatherNewsReports(); // Can take a while. print(newsDigest); } main() { printDailyNewsDigest(); printWinningLotteryNumbers(); printWeatherForecast(); printBaseballScore(); } 

рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рджрд┐рди рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕рдорд╛рдЪрд╛рд░ рдкрдврд╝рддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рд╡рд╣ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рд░реВрдЪрд┐ рд╣реИ:


 <gathered news goes here> Winning lotto numbers: [23, 63, 87, 26, 2] Tomorrow's forecast: 70F, sunny. Baseball score: Red Sox 10, Yankees 0 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ gatherNewsReports() рдмрд╛рдж рд╕рднреА рдСрдкрд░реЗрд╢рди gatherNewsReports() рд╣реЛ gatherNewsReports() рддрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рд╕рдм gatherNewsReports() рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рд╡рд╛рдкрд╕ рдирд╣реАрдВ рд╣реЛрдЧреАред рдпрджрд┐ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рд▓рдВрдмрд╛ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЯрд░реА, рдореМрд╕рдо рдХреЗ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдФрд░ рд╣рд╛рд▓ рдХреЗ рдЧреЗрдо рдХреЗ рд╡рд┐рдЬреЗрддрд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред


рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдбрд╛рд░реНрдЯ рд▓реЗрдЦрдХ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдорд╣рдВрдЧреЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ futures рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдирдХреЗ рдореВрд▓реНрдп рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ


рднрд╡рд┐рд╖реНрдп рдХреНрдпрд╛ рд╣реИ?


future рдореЗрдВ Future <T> рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЬреЛ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рд╣реИ рдЬреЛ рдЯрд╛рдЗрдк T рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдСрдкрд░реЗрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ future рдкреНрд░рдХрд╛рд░ Future<void> рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ future рд╣реИред future рд▓реМрдЯрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп, рджреЛ рдЪреАрдЬреЗрдВ рд╣реЛрддреА рд╣реИрдВ:


  1. рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХрддрд╛рд░ рдореЗрдВ рд╣реИ рдФрд░ рдПрдХ рдЕрдкреВрд░реНрдг Future рдСрдмреНрдЬреЗрдХреНрдЯ рджреЗрддрд╛ рд╣реИред
  2. рдмрд╛рдж рдореЗрдВ, рдЬрдм рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ future рдПрдХ рдореВрд▓реНрдп рдпрд╛ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

future рдирд┐рд░реНрднрд░ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рдкрд╛рд╕ рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:


  • async - async рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
  • Future рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

Async - рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ


async рдФрд░ await рдЦреЛрдЬрд╢рдмреНрдж Dart рдХреЗ async рд╕рдорд░реНрдерди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВред рд╡реЗ рдЖрдкрдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ Future рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕рдХреЗ рд╢рд░реАрд░ рдХреЗ рд╕рд╛рдордиреЗ async рдХреАрд╡рд░реНрдб рд╣реИред await рдХреАрд╡рд░реНрдб рдХреЗрд╡рд▓ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред


рдиреЛрдЯ: рдбрд╛рд░реНрдЯ 1.x рдореЗрдВ, рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлрд╝рдВрдХреНрд╢рди рддреБрд░рдВрдд рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рджреЗрд░реА рдХрд░рддреЗ рд╣реИрдВред рдбрд╛рд░реНрдЯ 2 рдореЗрдВ, рддреБрд░рдВрдд рд░реБрдХрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдкрд╣рд▓реЗ await рдпрд╛ return рддрдХ рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреЗ return ред

рдирд┐рдореНрди рдХреЛрдб async рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕рдорд╛рдЪрд╛рд░ рдкрдврд╝рдиреЗ рдХрд╛ рдЕрдиреБрдХрд░рдг await - await ред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдбрд╛рд░реНрдЯрдкреИрдб рдЦреЛрд▓реЗрдВ, рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП CONSOLE рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред


рдЙрджрд╛рд╣рд░рдг рдХреЛрдб
 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:async'; Future<void> printDailyNewsDigest() async { var newsDigest = await gatherNewsReports(); print(newsDigest); } main() { printDailyNewsDigest(); printWinningLotteryNumbers(); printWeatherForecast(); printBaseballScore(); } printWinningLotteryNumbers() { print('Winning lotto numbers: [23, 63, 87, 26, 2]'); } printWeatherForecast() { print("Tomorrow's forecast: 70F, sunny."); } printBaseballScore() { print('Baseball score: Red Sox 10, Yankees 0'); } const news = '<gathered news goes here>'; const oneSecond = Duration(seconds: 1); // Imagine that this function is more complex and slow. :) Future<String> gatherNewsReports() => Future.delayed(oneSecond, () => news); // Alternatively, you can get news from a server using features // from either dart:io or dart:html. For example: // // import 'dart:html'; // // Future<String> gatherNewsReportsFromServer() => HttpRequest.getString( // 'https://www.dartlang.org/f/dailyNewsDigest.txt', // ); 

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ printDailyNewsDigest() , рд▓реЗрдХрд┐рди рд╕рдорд╛рдЪрд╛рд░ рдЕрдВрддрд┐рдо рд░реВрдк рд╕реЗ рдореБрджреНрд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдкрдВрдХреНрддрд┐ рд╣реЛред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдЪрд▓рддрд╛ рд╣реИред


рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, printDailyNewsDigest() рдПрдХ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ gatherNewsReports() рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП gatherNewsReports() , рдЬреЛ рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рд╣реИред gatherNewsReports() рд▓рд┐рдП gatherNewsReports() рд╡рд┐рдзрд┐ рдХрд╛рдо рдХреЛ gatherNewsReports() , рд▓реЗрдХрд┐рди рдмрд╛рдХреА рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХрддреА рд╣реИред рдХрд╛рд░реНрдпрдХреНрд░рдо рдПрдХ рдмреЗрд╕рдмреЙрд▓ рдЦреЗрд▓ рдХреА рд▓реЙрдЯрд░реА рд╕рдВрдЦреНрдпрд╛, рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдФрд░ рд╕реНрдХреЛрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ; рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЗрдХрдЯреНрдард╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕рдорд╛рдЪрд╛рд░ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ gatherNewsReports() ред рдпрджрд┐ gatherNewsReports() рдХреЛ рдЕрдкрдирд╛ рдХрд╛рдо рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рддреЛ рдХреБрдЫ рднреА рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ: рджреИрдирд┐рдХ рд╕рдорд╛рдЪрд╛рд░ рдбрд╛рдЗрдЬреЗрд╕реНрдЯ рдХреЗ рдкреНрд░рд┐рдВрдЯ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЛ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИред


рд╡рд╛рдкрд╕реА рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред gatherNewsReports() рдХрд╛ gatherNewsReports() рдкреНрд░рдХрд╛рд░ gatherNewsReports() рдлрд╝рдВрдХреНрд╢рди Future<String> , рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ future рджреЗрддрд╛ рд╣реИред printDailyNewsDigest() рдлрд╝рдВрдХреНрд╢рди, рдЬреЛ рдорд╛рди рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдХрд╛ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ Future<void> ред


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрд░реЗрдЦ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдЪрд░рдгреЛрдВ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред



  1. рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рдирд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
  2. main() рдлрд╝рдВрдХреНрд╢рди рдХреЛ printDailyNewsDigest() рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлрд╝рдВрдХреНрд╢рди printDailyNewsDigest() , рдЬреЛ рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЪрд▓рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред
  3. printDailyNewsDigest() рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП await рдХрд╛ рдЙрдкрдпреЛрдЧ await gatherNewsReports() рд╕рдорд╛рд░реЛрд╣, рдЬреЛ рдЪрд▓рдирд╛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
  4. gatherNewsReports() рдПрдХ рдЕрдзреВрд░рд╛ future ( future рдПрдХ рдЙрджрд╛рд╣рд░рдг Future<String> ) рджреЗрддрд╛ рд╣реИред
  5. рдЪреВрдВрдХрд┐ printDailyNewsDigest() рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдФрд░ рдПрдХ рдореВрд▓реНрдп рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЕрдкреВрд░реНрдг рдореБрдЦреНрдп future (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, Future<void> ) рдХреЛ рдХреЙрд▓рд┐рдВрдЧ main () рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
  6. рдмрд╛рдХреА рдЖрдЙрдЯрдкреБрдЯ рдХрд╛рд░реНрдп рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рд╡реЗ рд╕рдордХрд╛рд▓рд┐рдХ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдЕрдЧрд▓реЗ рдкрд░ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рднреА рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рдирд┐рдд рд▓реЙрдЯрд░реА рд╕рдВрдЦреНрдпрд╛рдПрдВ рдореМрд╕рдо рдХреЗ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рдПрдВрдЧреАред
  7. main() рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж main() рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣рдо future рдХреЗ рд╕рдорд╛рдЪрд╛рд░ рдХреЗ рд╕рд╛рде gatherNewsReports() рд╣реИрдВ рдЬрдм рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрдорд╛ рд╣реЛ рдЬрд╛рддреЗ future ред рддрдм printDailyNewsDigest() рд╕рдорд╛рдЪрд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИред
  8. printDailyNewsDigest() рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдЕрдВрдд рдореЗрдВ, рдореВрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд future рдФрд░ рдЖрд╡реЗрджрди рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЬрд╛рддрд╛ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлрд╝рдВрдХреНрд╢рди рддреБрд░рдВрдд (рд╕рд┐рдВрдХреНрд░реЛрдирд╕) рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЕрдзреВрд░рд╛ future рдЬрдм рдирд┐рдореНрди рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреА рдкрд╣рд▓реА рдШрдЯрдирд╛ рд╣реЛрддреА рд╣реИ:


  • рдкрд╣рд▓реЗ await рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ (рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рдж рдЗрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рдЕрдзреВрд░рд╛ future рдорд┐рд▓рддрд╛ рд╣реИ)ред
  • рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреЛрдИ return ред
  • рдлрд╝рдВрдХреНрд╢рди рдмреЙрдбреА рдХрд╛ рдЕрдВрддред

рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдореЗрдВ рддреНрд░реБрдЯрд┐


рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдк future рд╡рд╛рдкрд╕ рд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ "рдкрдХрдбрд╝" рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ, рдЖрдк рдЯреНрд░рд╛рдЗ try-catch рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ:


 Future<void> printDailyNewsDigest() async { try { var newsDigest = await gatherNewsReports(); print(newsDigest); } catch (e) { // Handle error... } } 

рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ try-catch рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╡реИрд╕рд╛ рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ: рдпрджрд┐ try рдмреНрд▓реЙрдХ рдореЗрдВ рдХреЛрдб рдПрдХ рдЕрдкрд╡рд╛рдж try рд╣реИ, рддреЛ catch рдХреЗ рдЕрдВрджрд░ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИред


рдЕрдиреБрдХреНрд░рдорд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди


рдЖрдк рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХрд╛рдзрд┐рдХ await рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХрдерди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ:


 // Sequential processing using async and await. main() async { await expensiveA(); await expensiveB(); doSomethingWith(await expensiveC()); } 

expensiveB() рдлрд╝рдВрдХреНрд╢рди рдХреЛ рддрдм рддрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ expensiveA() рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реА рддрд░рд╣ред


рднрд╡рд┐рд╖реНрдп рдПрдкреАрдЖрдИ


рдбрд╛рд░реНрдЯ 1.9 рдореЗрдВ async рдФрд░ await рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ Future API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдерд╛ред рдЖрдк рдЕрднреА рднреА Future API рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреБрд░рд╛рдиреЗ рдХреЛрдб рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдб рдореЗрдВ рдЬрд┐рд╕реЗ asyncтАУawait рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ asyncтАУawait рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рдиреА рд╣реЛрдЧреАред


Future API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЙрд▓рдмреИрдХ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП then() рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред future рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдпрд╣ рдХреЙрд▓рдмреИрдХ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред


рдирд┐рдореНрди рдХреЛрдб Future рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕рдорд╛рдЪрд╛рд░ рдкрдврд╝рдиреЗ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдбрд╛рд░реНрдЯрдкреИрдб рдЦреЛрд▓реЗрдВ, рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП CONSOLE рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред


рдЙрджрд╛рд╣рд░рдг рдХреЛрдб
 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:async'; Future<void> printDailyNewsDigest() { final future = gatherNewsReports(); return future.then(print); // You don't *have* to return the future here. // But if you don't, callers can't await it. } main() { printDailyNewsDigest(); printWinningLotteryNumbers(); printWeatherForecast(); printBaseballScore(); } printWinningLotteryNumbers() { print('Winning lotto numbers: [23, 63, 87, 26, 2]'); } printWeatherForecast() { print("Tomorrow's forecast: 70F, sunny."); } printBaseballScore() { print('Baseball score: Red Sox 10, Yankees 0'); } const news = '<gathered news goes here>'; const oneSecond = Duration(seconds: 1); // Imagine that this function is more complex and slow. :) Future<String> gatherNewsReports() => Future.delayed(oneSecond, () => news); // Alternatively, you can get news from a server using features // from either dart:io or dart:html. For example: // // import 'dart:html'; // // Future<String> gatherNewsReportsFromServer() => HttpRequest.getString( // 'https://www.dartlang.org/f/dailyNewsDigest.txt', // ); 

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ printDailyNewsDigest() , рд▓реЗрдХрд┐рди рд╕рдорд╛рдЪрд╛рд░ рдЕрдВрддрд┐рдо рд░реВрдк рд╕реЗ рдореБрджреНрд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдкрдВрдХреНрддрд┐ рд╣реЛред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдЪрд▓рддрд╛ рд╣реИред


рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЪрд▓рддрд╛ рд╣реИ:


  1. рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рдирд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
  2. рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди printDailyNewsDigest() рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рддреБрд░рдВрдд рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ gatherNewsReports() ред
  3. gatherNewsReports() рд╕рдорд╛рдЪрд╛рд░ рдкрдврд╝рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ future рджреЗрддрд╛ future ред
  4. printDailyNewsDigest() then() рдХреЙрд▓рдмреИрдХ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП printDailyNewsDigest() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ future рдХреЗ рдЕрдВрдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдорд╛рди рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдЧрд╛ред then() рдХреЙрд▓ рдПрдХ рдирдпрд╛ future рджреЗрддрд╛ рд╣реИ, рдЬреЛ then() рд╕реЗ рдХреЙрд▓рдмреИрдХ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред
  5. рдмрд╛рдХреА рдЖрдЙрдЯрдкреБрдЯ рдХрд╛рд░реНрдп рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рд╡реЗ рд╕рдордХрд╛рд▓рд┐рдХ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдЕрдЧрд▓реЗ рдкрд░ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рднреА рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рдирд┐рдд рд▓реЙрдЯрд░реА рд╕рдВрдЦреНрдпрд╛рдПрдВ рдореМрд╕рдо рдХреЗ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рдПрдВрдЧреАред
  6. рдЬрдм рд╕рднреА рд╕рдорд╛рдЪрд╛рд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛ рдЧрдП рд╣реИрдВ, рддреЛ рдПрдХрддреНрд░ рдХрд┐рдП рдЧрдП рд╕рдорд╛рдЪрд╛рд░ рд╡рд╛рд▓реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде future рдиреЗ рд╡рд╛рдкрд╕ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рд╣реИред
  7. then() printDailyNewsDigest() рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЛрдб рд╕рдорд╛рдЪрд╛рд░ рдХреЛ printDailyNewsDigest() рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  8. рдЖрд╡реЗрджрди рдмрдВрдж рд╣реЛ рд░рд╣рд╛ рд╣реИред

рдиреЛрдЯ: printDailyNewsDigest() рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдХреЛрдб future.then(print) рдирд┐рдореНрди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ: future.then((newsDigest) => print(newsDigest)) ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдВрджрд░ рдХреЛрдб then() рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 Future<void> printDailyNewsDigest() { final future = gatherNewsReports(); return future.then((newsDigest) { print(newsDigest); // Do something else... }); } 

рдЖрдкрдХреЛ рдХреЙрд▓рдмреИрдХ рддрд░реНрдХ рдХреЛ then() рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ then() , рднрд▓реЗ рд╣реА future рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛ Future<void> ред рд╕рдореНрдореЗрд▓рди рджреНрд╡рд╛рд░рд╛, рдПрдХ рдЕрдкреНрд░рдпреБрдХреНрдд рддрд░реНрдХ рдХреЛ _ (рдЕрдВрдбрд░рд╕реНрдХреЛрд░) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


 final future = printDailyNewsDigest(); return future.then((_) { // Code that doesn't use the `_` parameter... print('All reports printed.'); }); 

рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдореЗрдВ рддреНрд░реБрдЯрд┐


Future API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк catchError() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддреНрд░реБрдЯрд┐ рдХреЛ рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:


 Future<void> printDailyNewsDigest() => gatherNewsReports().then(print).catchError(handleError); 

рдпрджрд┐ рд╕рдорд╛рдЪрд╛рд░ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ, рддреЛ рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


  1. gatherNewsReports() рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рд╡рд┐рдлрд▓ред
  2. then() рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ future then() рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ, print() рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
  3. catchError() ( handleError() ) рдореЗрдВ catchError() рддреНрд░реБрдЯрд┐ рдХреЛ рдкрдХрдбрд╝рддрд╛ рд╣реИ, catchError() рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ future рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкреВрд░рд╛ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рддреНрд░реБрдЯрд┐ рдЖрдЧреЗ рдкреНрд░рдЪрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреА рд╣реИред

Future API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп then() рд╢реНрд░реГрдВрдЦрд▓рд╛ - catchError() рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рд╣реИред рдЗрд╕ рдЬреЛрдбрд╝реА рдХреЛ Future рдПрдкреАрдЖрдИ рдореЗрдВ рдПрдХ try-catch рдХреЗ рдмрд░рд╛рдмрд░ рдорд╛рдиреЗрдВред

рддрдм рдХреА рддрд░рд╣ (), catchError () рдПрдХ рдирдпрд╛ future рджреЗрддрд╛ рд╣реИ рдЬреЛ рдХреЙрд▓рдмреИрдХ рдХреЗ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рд╡рд┐рд╖рдп рдореЗрдВ рдЧреЛрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд╛рдпрджрд╛ рдФрд░ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдкрдврд╝реЗрдВред


future рд▓реМрдЯрдиреЗ рд╡рд╛рд▓реЗ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛


рдЖрдЗрдП рддреАрди рдХрд╛рд░реНрдпреЛрдВ expensiveA() рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: expensiveA() , expensiveB() , expensiveC() , рдЬреЛ future рд╡рд╛рдкрд╕ рдХрд░рддреЗ future ред рдЖрдк рдЙрдиреНрд╣реЗрдВ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ (рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ), рдпрд╛ рдЖрдк рдЙрди рд╕рднреА рдХреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬреИрд╕реЗ рд╣реА рд╕рднреА рдорд╛рди рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реИрдВ, рдХреБрдЫ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджреЛрдиреЛрдВ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╡рд┐рд╖реНрдп рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░реНрдпрд╛рдкреНрдд рд▓рдЪреАрд▓рд╛ рд╣реИред


then() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛
рдЬрдм future рд▓реМрдЯрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреНрд░рдо рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, then() рд╕реЗ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ then() :


 expensiveA() .then((aValue) => expensiveB()) .then((bValue) => expensiveC()) .then((cValue) => doSomethingWith(cValue)); 

рдХреЙрд▓рдмреИрдХ рд╕рдВрд▓рдЧреНрди рдХрд░рдирд╛ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред ( рдиреЛрдЯ http://callbackhell.com/ )


Future.wait() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдИ futures рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ
рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдХреНрд░рдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк Future.wait() рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬрдм рдЖрдк Future.wait () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА futures рд╕реВрдЪреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рддреБрд░рдВрдд future рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдпрд╣ future рддрдм рддрдХ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рд╕рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ futures ред рдпрд╣ future рд╕рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ futures рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдЧрд╛ред


 Future.wait([expensiveA(), expensiveB(), expensiveC()]) .then((List responses) => chooseBestResponse(responses, moreInfo)) .catchError(handleError); 

рдпрджрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХреЙрд▓ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ Future.wait() рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ future рднреА рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП catchError() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред




рдФрд░ рдХреНрдпрд╛ рдкрдврд╝рдирд╛ рд╣реИ?


рдбрд╛рд░реНрдЯ 2. рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ: рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо

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


All Articles