async
/ await
рдХреЗ рдЖрдЧрдорди рдХреЗ рдмрд╛рдж рд╕реЗ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдиреЗ рдХрдИ рд▓реЗрдЦ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдП рд╣реИрдВ рдЬреЛ рдЗрд╕ рд╡рд┐рдХрд╛рд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг ( рд╣реИрдХрд░реНрдиреВрди , blog.bitsrc.io , habr.com ) рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ ред рд╣рдо рдЙрдиреНрд╣реЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рддрд░рдл рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ (рдЬрдм ES6 рдЬреЗрдирд░реЗрдЯрд░ 50% рд╕реЗ рдХрдо рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ)ред рдФрд░ рдЕрдм рдореИрдВ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрди рд╡рд╣ рд╕рдм рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЗрд╕ рдорд╛рд░реНрдЧ рдХреЗ рд╕рд╛рде рдЬрд╛рдирдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред
рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдВрддрд┐рдо рд▓реЗрдЦ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ: рдХреБрдЫ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдореИрдВ рдорд╛рд▓рд┐рдХрд╛рдирд╛ рдХреЛрдб рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ - рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЗрд╕рд▓рд┐рдП:
- рдкрдврд╝рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЯреИрдм рдмрдВрдж рдХрд░рдиреЗ рдореЗрдВ рд╕рдВрдХреЛрдЪ рди рдХрд░реЗрдВ
- рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╡рд░рдг рдорд╛рдВрдЧреЗрдВ
- рдореИрдВ рдЦрд╝реБрд╢реА рд╕реЗ рд╕рд▓рд╛рд╣ рдФрд░ рдЖрд▓реЛрдЪрдирд╛ рдХреЛ рд╕рдмрд╕реЗ рд▓рдЧрд╛рддрд╛рд░ рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЦреЛрдЬреЗ рдЧрдП рдмрд┐рдВрджреБ рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реВрдБрдЧрд╛ред
рдореБрдЦреНрдп рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА:
- рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдХрдИ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдореБрдЦреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп ExtJS рд╣реИред рдпрд╣ рд░рд┐рдПрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреИрд╢рди рдореЗрдВ рд╣реАрдирддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕рдореГрджреНрдз рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдЙрджреНрдпрдо рдЙрддреНрдкрд╛рдж рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реИ: рдХрдИ рддреИрдпрд╛рд░ рдШрдЯрдХреЛрдВ, рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдЯреЗрдмрд▓, рд╡рд┐рдХрд╛рд╕ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдЙрддреНрдкрд╛рджреЛрдВ рдХрд╛ рдПрдХ рд╕рдореГрджреНрдз рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ред
- рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рд╕рд░реНрд╡рд░ред
- Websocket рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ RPC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рдкрд░рд┐рд╡рд╣рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди .NET WCF рдХреЗ рд╕рдорд╛рди рд╣реИред
- рдХреЛрдИ рднреА рд╡рд╕реНрддреБ рдПрдХ рд╕реЗрд╡рд╛ рд╣реИред
- рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдХреЛ рдореВрд▓реНрдп рдФрд░ рд╕рдВрджрд░реНрдн рджреЛрдиреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
- рдбреЗрдЯрд╛ рдЕрдиреБрд░реЛрдз рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗрд╡рд▓ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░, рдлреЗрд╕рдмреБрдХ рд╕реЗ рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред
- рджреЛ-рддрд░рдлрд╝рд╛ рд╕рдВрдЪрд╛рд░: рдбреЗрдЯрд╛ рдЕрджреНрдпрддрди рдХрд╛ рдЖрд░рдВрдн рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рд╕реЗ рджреЛрдиреЛрдВ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
- рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб рдХреЛ рдЯрд╛рдЗрдкрдХреНрд░рд┐рд╕рд┐рдкреНрдЯ рдХреЗ рдПрд╕рд┐рдВрдХреНрд╕ / рд╡реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рд╕рд░реНрд╡рд░ рдПрдкреАрдЖрдИ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ: рдпрджрд┐ рдпрд╣ рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд┐рд▓реНрдб рддреБрд░рдВрдд рджрд┐рдЦрд╛рдПрдЧрд╛ред
рдЖрдЙрдЯрдкреБрдЯ рдХреНрдпрд╛ рд╣реИ
рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдЗрд╕ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рдордиреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдХреЗ рд╕реБрд░рдХреНрд╖рд┐рдд, рдЧреИрд░-рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд┐рдпрд╛ рд╣реИ: рд╣рдорд╛рд░реЗ рдЯрд╛рдЗрдкрд╕рдЯреНрд░рд┐рдк рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдЬреЛ рдХрддрд╛рд░реЛрдВ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдореВрд▓ рд╕реЗ рд▓реЗрдХрд░ рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдЕрдиреНрдп рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рдиред
рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреИрд╕реЗ рд╕рдВрд░рдЪрд┐рдд рд╣реИ
рд╕рд░реНрд╡рд░ рдПрдХ рдореВрд▓ рд╡рд╕реНрддреБ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЧреНрд░рд╛рдл рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХреЗ рдЧреБрдгреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ (рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ, рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕, рдкрдВрдХреНрддрд┐рдпреЛрдВ рдЖрджрд┐ рдХрд╛ рд╕рдВрдЧреНрд░рд╣) рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдХрд╛рд░рдг рд╣реИ, рдЖрд╡реЗрджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рд╕рд╛рде:
- рдпрд╣ рдбреЗрдЯрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг / рд╣реИрдВрдбрд▓рд░ рдиреЛрдбреНрд╕ рдХреЗ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдЧреНрд░рд╛рдл рдХреЛ рдПрдордПрд▓ рдмрдирд╛рддрд╛ рд╣реИред
- рдмрджрд▓реЗ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдХрд╛ рдЕрдкрдирд╛ рдПрдореНрдмреЗрдбреЗрдб рдЧреНрд░рд╛рдл рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
- рд░реЗрдЦрд╛рдВрдХрди рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рд╣реЛрддреА рд╣реИрдВ: рдиреЛрдбреНрд╕ "рд╡рдВрд╢рд╛рдиреБрдЧрдд" рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдирдП рдиреЛрдбреНрд╕ рдЙрдирдХреЗ "рд╡рд░реНрдЧ" рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдЧреНрд░рд╛рдлрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрд╡реЗрд░реА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓, рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рднреА рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛:
рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдбреЗрдЯрд╛ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ
рдпрд╣ рд╕рд░рд▓ рд╣реИ: рдЬрдм рдЖрдк рдПрдХ рдЧреИрд░-рд╕реНрдХреЗрд▓рд░ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрд░рдкреАрд╕реА рд░рд┐рдЯрд░реНрди Promise
:
let Nodes = Parent.Nodes;
рдПрдХ "рдХреЙрд▓рдмреИрдХ рд╣реЗрд▓" рдХреЗ рдмрд┐рдирд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХред
"рдЕрдиреБрдХреНрд░рдорд┐рдХ" рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ async
/ await
рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
async function ShowNodes(parent: IParent): Promise<void> {
рдЗрд╕ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд░рд╣рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рд╣рдм рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╛рдордЧреНрд░реА рд╣реИ ред рд╡реЗ 2016 рдореЗрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд╛рдкрд╕ рдЖ рдЧрдПред рд╣рдо рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА рдлреАрдЪрд░ рд╢рд╛рдЦрд╛ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдмрд╣реБрдд рдкрд╣рд▓реЗ рд╣реА рдзрдХреНрдХреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдФрд░ рдЕрдм рдЦреБрд╢реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЕрднреА рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП, рдФрд░ рдЙрддреНрдкрд╛рджрди рдореЗрдВред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рд░ рдЬреЛ рд╡рд┐рд╖рдп рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ:
рдЬреИрд╕реЗ рд╣реА рдЖрдк async
рдХреАрд╡рд░реНрдб рдХреЛ рдлрдВрдХреНрд╢рди рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ Promise<_>
рд▓реМрдЯрд╛ рджреЗрдЧрд╛ред рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ:
async
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ await
рд╕рд╛рде (рдЬреЛ Promise
рд╡рд╛рдкрд╕ рдХрд░рддреА рд╣реИрдВ) рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХ рджреЗрдВрдЧреА рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд Promise
рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреАред- рдпрджрд┐ рдХреЛрдИ рдЕрдкрд╡рд╛рдж
async
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рджрд┐рдП рдЧрдП Promise
рдХреЛ рдЗрд╕ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред - рдЬрдм рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ ES6 рдорд╛рдирдХ (
function*
рдПрд╕реНрдХрд┐рдВрдХ function*
рдмрдЬрд╛рдп async function
рдФрд░ await
рдмрдЬрд╛рдп yield
) рдХреЗ рд▓рд┐рдП рдЬрдирд░реЗрдЯрд░ рд╣реЛрдВрдЧреЗ рдпрд╛ ES5 (рд░рд╛рдЬреНрдп рдорд╢реАрди) рдХреЗ рд▓рд┐рдП switch
рдХреЗ рд╕рд╛рде рдбрд░рд╛рд╡рдирд╛ рдХреЛрдбред await
рдПрдХ рдХреАрд╡рд░реНрдб рд╣реИ рдЬреЛ рдПрдХ рд╡рд╛рджрд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рдмреИрдардХ рдХреЗ рд╕рдордп, рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди, ShowNodes
рдлрд╝рдВрдХреНрд╢рди рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдбреЗрдЯрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╕рдордп, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреБрдЫ рдЕрдиреНрдп рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдореЗрдВ, рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдПрдХ forEachParallel
рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓рдмреИрдХ рдХрд╣рддреА рд╣реИред рдЙрд╕реА рд╕рдордп, Nodes.forEachParallel
рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ рд╕рднреА рдХреЙрд▓рдмреИрдХ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВрдЧреЗред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЕрдВрджрд░ - Promise.all
:
export async function forEachParallel<T>(items: IItemArray<T>, callbackfn: (value: T, index: int, items: IItemArray<T>) => Promise<void | any>, thisArg?: any): Promise<void> { let xCount = items ? await items.Count : 0; if (!xCount) return; let xActions = new Array<Promise<void | any>>(xCount); for (let i = 0; i < xCount; i++) { let xItem = items.Item(i); xActions[i] = ExecuteCallback(xItem, callbackfn, i, items, thisArg); } await Promise.all(xActions); } /** item callbackfn */ async function ExecuteCallback<T>(item: Promise<T> | T, callbackfn: (value: T, index: int, items: IItemArray<T>) => Promise<void | any>, index: int, items: IItemArray<T>, thisArg?: any): Promise<void> { let xItem = await item; await callbackfn.call(thisArg, xItem, index, items); }
рдпрд╣ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдЪреАрдиреА рд╣реИ: рдЗрд╕ рддрд░рд╣ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХреЗрд╡рд▓ рдЙрдирдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдмрд▓реНрдХрд┐ рдорд╛рдирдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
ShowNodes
рдлрд╝рдВрдХреНрд╢рди рдмреЗрд╣рдж рдЧреИрд░-рдЗрд╖реНрдЯрддрдо рджрд┐рдЦрддрд╛ рд╣реИ: рдЬрдм рд╣рдо рдХрд┐рд╕реА рдЕрдиреНрдп рдЗрдХрд╛рдИ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╣рд░ рдмрд╛рд░ рдЗрд╕рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред рд╕реБрд╡рд┐рдзрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рддрд░реАрдХрд╛ рддреЗрдЬреА рд╕реЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИред рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдЖрдкрдХреЛ рд╕рд░реНрд╡рд░ рдХреЛ рдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╡реЗрд░реА рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдХреНрд╡реЗрд░реА рднрд╛рд╖рд╛
рдХрдИ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ рд╕рд░реНрд╡рд░ рд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╡реЗ "рдмрддрд╛" рд╕рд░реНрд╡рд░ рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд▓реМрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдЧреНрд░рд╛рдл рдХреЗ рдиреЛрдбреНрд╕:
selectAsync<T extends IItem>(item: T, properties: () => any[]): Promise<T>; selectAsyncAll<T extends ICollection>(items: T[], properties: () => any[]): Promise<T[]>; select<T>(item: T, properties: () => any[]): T; selectAll<T>(items: T[], properties: () => any[]): T[];
рдЕрдм рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдЖрд╡рд╢реНрдпрдХ рдПрдореНрдмреЗрдбреЗрдб рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЖрд╡реЗрджрди рдХреЛ рджреЗрдЦреЗрдВ:
async function ShowNodes(parentPoint: IParent): Promise<void> {
рдЧрд╣рд░рд╛рдИ рд╕реЗ рдПрдореНрдмреЗрдбреЗрдб рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдереЛрдбрд╝реА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХреНрд╡реЗрд░реА рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
рдХреНрд╡реЗрд░реА рднрд╛рд╖рд╛ рд╕рд░реНрд╡рд░ рд╕реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЕрдиреБрд░реЛрдзреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреА рд╣реИред рд▓реЗрдХрд┐рди рдХреЛрдб рдХрднреА рднреА рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрдИ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдЕрдиреБрд░реЛрдз рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ред
рд░реЗрд╕ рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рд╕рдорд╛рдзрд╛рди
рдЪреВрдВрдХрд┐ рд╣рдо рд╕рд░реНрд╡рд░ рдИрд╡реЗрдВрдЯ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдПрдХ рд░реЗрд╕ рдХреА рд╕реНрдерд┐рддрд┐ рддрдм рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрдм FuncOne
рдлрд╝рдВрдХреНрд╢рди рдмрд╛рдзрд┐рдд рд╣реЛрддрд╛ рд╣реИ, Promise
рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЗрд╕ рд╕рдордп, рдПрдХ рд╕рд░реНрд╡рд░ рдИрд╡реЗрдВрдЯ (рдпрд╛ рдЕрдЧрд▓реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╕реЗ) рдЖ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдкрд░, рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдореЙрдбрд▓ рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рдлрд┐рд░ FuncOne
рд╡рд╛рджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╕реЗ рд╣рдЯрд╛рдП рдЧрдП рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред
рдРрд╕реА рд╕рд░рд▓реАрдХреГрдд рд╕реНрдерд┐рддрд┐ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ: IParent
рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ IParent
рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╣реИред
Parent.OnSynchronize.AddListener(async function(): Promise<void> {
рдпрд╣ рддрдм рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╕рд░реНрд╡рд░ рдкрд░ INodes
рдиреЛрдбреНрд╕ рдХреА рд╕реВрдЪреА рдЕрдкрдбреЗрдЯ рдХреА рдЬрд╛рддреА рд╣реИред рдлрд┐рд░, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ, рдПрдХ рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рд╕рдВрднрд╡ рд╣реИ:
- рд╣рдо рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдиреЛрдб рдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреЗ рд╣реИрдВ, рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ
async function OnClickRemoveNode(node: INode): Promise<void> { let removedOnServer: boolean = await Parent.RemoveNode(node);
Parent.OnSynchronize
рдорд╛рдзреНрдпрдо рд╕реЗ, рдиреЛрдб рд╕реВрдЪреА рдШрдЯрдирд╛ рдХрд╛ рдПрдХ рдЕрджреНрдпрддрди рд╣реЛрддрд╛ рд╣реИредParent.OnSynchronize
рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ Parent.OnSynchronize
рд╣реИ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИредasync OnClickRemoveNode()
рдкрд╣рд▓реЗ await
рдмрд╛рдж рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж async OnClickRemoveNode()
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЖрдк OnClickRemoveNode
рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдкрд░ рдПрдХ рдЪреЗрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рд╕рд░рд▓реАрдХреГрдд рдЙрджрд╛рд╣рд░рдг рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рд╕рдорд╛рди рдЬрд╛рдБрдЪ рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдХреЙрд▓ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ? рдЗрд╕рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ await
рдмрд╛рдж рдПрдХ рд╕рдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреБрд░рд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИ:
- рдЗрддрдирд╛ рдлреВрд▓рд╛ рд╣реБрдЖ рдХреЛрдб рд╕рдорд░реНрдерди рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд┐рдП рдЬрдЯрд┐рд▓ рд╣реИред
- рдХреЛрдб рдЗрд░рд╛рджрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:
OnClickRemoveNode
рдореЗрдВ рд╡рд┐рд▓реЛрдкрди OnClickRemoveNode
, рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рд▓реЛрдкрди рдХрд╣реАрдВ рдФрд░ рд╣реЛрддрд╛ рд╣реИред рдбреЗрд╡рд▓рдкрд░ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдкреНрд░рддрд┐рдЧрдорди рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрдВрдЧреАред - рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдирд╣реАрдВ рд╣реИ: рдпрджрд┐ рдЖрдк рдХрд╣реАрдВ рдЪреЗрдХ рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреАред рдЦрддрд░рд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдХрд┐ рдПрдХ рднреВрд▓реА рд╣реБрдИ рдЬрд╛рдБрдЪ рд╕реНрдерд╛рдиреАрдп рд╕реНрддрд░ рдкрд░ рдФрд░ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдФрд░ рдЕрдзрд┐рдХ рд▓рдВрдмреА рдиреЗрдЯрд╡рд░реНрдХ рджреЗрд░реА рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╣реЛрдЧрд╛ред
- рдФрд░ рдЕрдЧрд░ рдирд┐рдпрдВрддреНрд░рдХ рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ рдпреЗ рд╣реИрдВрдбрд▓рд░ рд╣реИрдВ, рдЙрд╕реЗ рдирд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдмрд╛рдж рдЗрд╕рдХреЗ рд╡рд┐рдирд╛рд╢ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
await
рдХрд░ рд░рд╣рд╛ рд╣реИ
рдПрдХ рдФрд░ рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ: рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╕рдорд╛рди рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛рддреНрдордХ рддрд░реАрдХреЗ рд╣реИрдВ? рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдФрд░ рднреА рд╣реИрдВ:
- рдПрдХ рдиреЛрдб рдЬреЛрдбрд╝рдирд╛
- рдиреЛрдб рдЕрдкрдбреЗрдЯ
- рд▓рд┐рдВрдХ рдЬреЛрдбрд╝реЗрдВ / рдирд┐рдХрд╛рд▓реЗрдВ
- рдПрдХрд╛рдзрд┐рдХ рдиреЛрдб рд░реВрдкрд╛рдВрддрд░рдг рд╡рд┐рдзрд┐
- рдЖрд╡реЗрджрди рдХрд╛ рдЬрдЯрд┐рд▓ рд╡реНрдпрд╡рд╣рд╛рд░: рд╣рдо рдПрдХ рдиреЛрдб рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ рдФрд░ рд╕рд░реНрд╡рд░ рдЙрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдиреЛрдбреНрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИред
рдПрдХ рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдирд╕реНрд▓ рдХреА рд╕реНрдерд┐рддрд┐, рд╕рдорд╛рдирд╛рдВрддрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛рд░реНрдпреЛрдВ рдЖрджрд┐ рдХреЗ рдХрд╛рд░рдг рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдХреНрд▓рд╛рдЗрдВрдЯ рдпрд╛ рд╕рд░реНрд╡рд░ рд╕реЗ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рд╕рд╣реА рд╕рдорд╛рдзрд╛рди рдХреЙрд▓ рдХреНрдпреВ рдХреЗ рд╕рд╛рде рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрднрд╛рдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдбреЗрдХреЛрд░реЗрдЯрд░ рдпрд╣рд╛рдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреЗред
рд╣рдо рдРрд╕реЗ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдФрд░ рдкреНрд░рдореБрдЦ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
- рдЕрдВрджрд░, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рдкрдВрдХреНрддрд┐рдмрджреНрдз рдпрд╛ рдЕрд╕реНрд╡реАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЙрд╕рдореЗрдВ рдЕрдиреНрдп рдХреЙрд▓ рд╣реИрдВред
- рдЪрд┐рд╣реНрдирд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрддрд╛рд░ рдореЗрдВ рдмрд╛рдВрдзрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдВрджрд░реНрдн рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЖрдкрдХреЛ рдпрд╛ рддреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдХрддрд╛рд░ рдмрдирд╛рдиреА рд╣реЛрдЧреА, рдпрд╛ рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрд╕ рд╡реНрдпреВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рд╣реИред
- рдирд┐рдпрдВрддреНрд░рдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╡рд┐рдирд╛рд╢ рдкрд░ рдЬрд╛рдирдХрд╛рд░реА рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
IsDestroyed
рд╕рдВрдкрддреНрддрд┐)ред рдирд┐рдпрдВрддреНрд░рдХ рдирд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЛ рдХрддрд╛рд░рдмрджреНрдз рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдПред - рд╡реНрдпреВ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рд▓рд┐рдП, рдЬрдм рдХрддрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреА рд╣реИ рдФрд░ рдиреЗрддреНрд░рд╣реАрди рд░реВрдк рд╕реЗ рдкреНрд░рдЧрддрд┐ рдХрд╛ рд╕рдВрдХреЗрдд рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рднрд╛рд╕реА рдорд╛рд╕реНрдХ рд▓рдЧрд╛рдиреЗ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
- рд╕рднреА рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ
Promise.done()
рдХреЛ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ, рдЖрдкрдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрдкрд╡рд╛рдж рдХреЗ handler
рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдкрдпреЛрдЧреА рдЪреАрдЬ:
рдЕрдм рд╣рдо рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдРрд╕реЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреА рдПрдХ рдЕрдиреБрдорд╛рдирд┐рдд рд╕реВрдЪреА рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
@Lock @LockQueue @LockBetween @LockDeferred(300)
рд╡рд┐рд╡рд░рдг рдХрд╛рдлреА рд╕рд╛рд░рдЧрд░реНрднрд┐рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рд╣реА рдЖрдк рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрддреЗ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛:
class GraphController implements ILockTarget { private View: IView; public GetControllerView(): IView { return this.View; } @Lock private async OnClickRemoveNode(): Promise<void> { ... } @Lock private async OnClickRemoveLink(): Promise<void> { ... } @Lock private async OnClickAddNewNode(): Promise<void> { ... } @LockQueue private async OnServerUpdateNode(): Promise<void> { ... } @LockQueue private async OnServerAddLink(): Promise<void> { ... } @LockQueue private async OnServerAddNode(): Promise<void> { ... } @LockQueue private async OnServerRemoveNode(): Promise<void> { ... } @LockBetween private async OnServerSynchronize(): Promise<void> { ... } @LockQueue private async OnServerUpdateNodeStatus(): Promise<void> { ... } @LockDeferred(300) private async OnSearchFieldChange(): Promise<void> { ... } }
рдЕрдм рд╣рдо рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдФрд░ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдирдХреЗ рдЙрдиреНрдореВрд▓рди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ:
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ:
OnClickRemoveNode
, OnClickRemoveLink
ред рдЙрдЪрд┐рдд рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдХрддрд╛рд░ рдореЗрдВ (рдпрд╛ рддреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдпрд╛ рд╕рд░реНрд╡рд░) рдХреЛрдИ рдЕрдиреНрдп рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реИрдВрдбрд▓рд░ рдирд╣реАрдВ рд╣реИрдВред рдЕрдиреНрдпрдерд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд╕реА рддреНрд░реБрдЯрд┐ рд╕рдВрднрд╡ рд╣реИ:
- рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдореЙрдбрд▓ рдЕрднреА рднреА рд╡рд░реНрддрдорд╛рди рд╕рд░реНрд╡рд░ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
- рд╣рдо рдЕрджреНрдпрддрди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдкрд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ (рдХрддрд╛рд░ рдореЗрдВ
OnServerSynchronize
рдореЗрдВ рдПрдХ OnServerSynchronize
рд╣реИрдВрдбрд▓рд░ рд╣реИ)ред рд▓реЗрдХрд┐рди рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдм рдирд╣реАрдВ рд╣реИ - рдмрд╕ рдкреВрд░реНрдг рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдЕрднреА рддрдХ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ рдФрд░ рдпрд╣ рдЕрднреА рднреА рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рд╢реБрд░реВ рдХреА рдЧрдИ рд╕рднреА рдХреНрд░рд┐рдпрд╛рдПрдВ, Lock
рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рдХрддрд╛рд░ рдореЗрдВ рдЕрдиреНрдп рд╣реИрдВрдбрд▓рд░ рд╕рдорд╛рди рдХрддрд╛рд░ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рд╣реИрдВред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╕рд░реНрд╡рд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИ, рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рд╣рд╛рдВ, Websocket рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдЕрдиреБрдХреНрд░рдо рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред
- рд╣рдо рдПрдХ рдиреЛрдб рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЖрд░рдВрдн рдХрд░рддреЗ рд╣реИрдВ:
OnClickAddNewNode
ред OnServerSynchronize
, OnServerAddNode
рдИрд╡реЗрдВрдЯ рд╕рд░реНрд╡рд░ рд╕реЗ рдЖрддреЗ рд╣реИрдВред
OnClickAddNewNode
рдиреЗ рдХрддрд╛рд░ OnClickAddNewNode
(рдпрджрд┐ рдЗрд╕рдореЗрдВ рдХреБрдЫ рдерд╛, рддреЛ рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ Lock
рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЙрд▓ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджреЗрдЧрд╛)OnClickAddNewNode
, OnClickAddNewNode
OnServerAddNode
, OnClickAddNewNode
рдмрд╛рдж рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд, рдЗрд╕рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдирд╣реАрдВред
- рдХрддрд╛рд░ рдореЗрдВ
OnServerSynchronize
рдФрд░ OnServerUpdateNode
ред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдкрд╣рд▓реЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ GraphController
рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред рдлрд┐рд░ OnServerUpdateNode
рджреВрд╕рд░реА рдХреЙрд▓ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдирд╖реНрдЯ рдирд┐рдпрдВрддреНрд░рдХ рдкрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рди рд╣реЛ, рдЬреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрдирдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, ILockTarget
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ IsDestroyed
- рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХрддрд╛рд░ рд╕реЗ рдЕрдЧрд▓реЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдзреНрд╡рдЬ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред
рд▓рд╛рдн: рдкреНрд░рддреНрдпреЗрдХ await
рдмрд╛рдж if (!this.IsDestroyed())
рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред - рдХрдИ рдиреЛрдбреНрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
OnServerSynchronize
, OnServerUpdateNode
рдИрд╡реЗрдВрдЯ рд╕рд░реНрд╡рд░ рд╕реЗ рдЖрддреЗ рд╣реИрдВред рдЙрдирдХреЗ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдирд┐рд╖реНрдкрд╛рджрди рд╕реЗ рдЕрдкреВрд░рдгреАрдп рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрдВрдЧреАред рд▓реЗрдХрд┐рди рдХрдм рд╕реЗ LockQueue
рд╡реЗ LockQueue
рдФрд░ LockBetween
рджреНрд╡рд╛рд░рд╛ рдЪрд┐рд╣реНрдирд┐рдд рд╣реИрдВ, LockQueue
рдЙрдиреНрд╣реЗрдВ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред - рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдиреЛрдбреНрд╕ рдХреЗ рдЕрдВрджрд░ рдиреЗрд╕реНрдЯреЗрдб рдиреЛрдб рдЧреНрд░рд╛рдл рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
GraphController #1
, тАФ GraphController #2
. , GraphController
- , ( тАФ ), .. . :
OnSearchFieldChange
, . - . @LockDeferred(300)
300 : , , 300 . , . :
- , 500 , . тАФ
OnSearchFieldChange
, . OnSearchFieldChange
тАФ , .
- Deadlock:
Handler1
, , await
Handler2
, LockQueue
, Handler2
тАФ Handler1
. - , View . : , тАФ .
, , . :
- -
<Class>
. <Method>
=> <Time>
( ). - .
- .
, , , . ? ? :
class GraphController implements ILockTarget { private View: IView; public GetControllerView(): IView { return this.View; } @Lock private async RunBigDataCalculations(): Promise<void> { await Start(); await UpdateSmth(); await End(); await CleanUp(); } @LockQueue private async OnChangeNodeState(node: INode): Promise<void> { await GetNodeData(node); await UpdateNode(node); } }
:
RunBigDataCalculations
.await Start();
- / ( )
await Start();
, await UpdateSmth();
.
:
RunBigDataCalculations
.OnChangeNodeState
, (.. ).await GetNodeData(node);
- / ( )
await GetNodeData(node);
, await UpdateNode(node);
.
- . :
export interface IQueuedDisposableLockTarget extends ILockTarget { IsDisposing(): boolean; SetDisposing(): void; }
function QueuedDispose(controller: IQueuedDisposableLockTarget): void {
, . QueuedDispose
:
- . .
QueuedDispose
controller
. тАФ ExtJS .
, , .. . , ? , .
, :
vk.com
Telegram