рдЕрдореАрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдФрд░ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпрд╣ рдореБрдХрд╛рдмрд▓рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

async / await рдХреЗ рдЖрдЧрдорди рдХреЗ рдмрд╛рдж рд╕реЗ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдиреЗ рдХрдИ рд▓реЗрдЦ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдП рд╣реИрдВ рдЬреЛ рдЗрд╕ рд╡рд┐рдХрд╛рд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг ( рд╣реИрдХрд░реНрдиреВрди , blog.bitsrc.io , habr.com ) рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ ред рд╣рдо рдЙрдиреНрд╣реЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рддрд░рдл рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ (рдЬрдм ES6 рдЬреЗрдирд░реЗрдЯрд░ 50% рд╕реЗ рдХрдо рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ)ред рдФрд░ рдЕрдм рдореИрдВ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрди рд╡рд╣ рд╕рдм рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЗрд╕ рдорд╛рд░реНрдЧ рдХреЗ рд╕рд╛рде рдЬрд╛рдирдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред


рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдВрддрд┐рдо рд▓реЗрдЦ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ: рдХреБрдЫ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдореИрдВ рдорд╛рд▓рд┐рдХрд╛рдирд╛ рдХреЛрдб рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ - рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЗрд╕рд▓рд┐рдП:


  • рдкрдврд╝рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЯреИрдм рдмрдВрдж рдХрд░рдиреЗ рдореЗрдВ рд╕рдВрдХреЛрдЪ рди рдХрд░реЗрдВ
  • рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╡рд░рдг рдорд╛рдВрдЧреЗрдВ
  • рдореИрдВ рдЦрд╝реБрд╢реА рд╕реЗ рд╕рд▓рд╛рд╣ рдФрд░ рдЖрд▓реЛрдЪрдирд╛ рдХреЛ рд╕рдмрд╕реЗ рд▓рдЧрд╛рддрд╛рд░ рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЦреЛрдЬреЗ рдЧрдП рдмрд┐рдВрджреБ рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реВрдБрдЧрд╛ред

рдореБрдЦреНрдп рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА:


  • рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдХрдИ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдореБрдЦреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп ExtJS рд╣реИред рдпрд╣ рд░рд┐рдПрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреИрд╢рди рдореЗрдВ рд╣реАрдирддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕рдореГрджреНрдз рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдЙрджреНрдпрдо рдЙрддреНрдкрд╛рдж рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реИ: рдХрдИ рддреИрдпрд╛рд░ рдШрдЯрдХреЛрдВ, рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдЯреЗрдмрд▓, рд╡рд┐рдХрд╛рд╕ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдЙрддреНрдкрд╛рджреЛрдВ рдХрд╛ рдПрдХ рд╕рдореГрджреНрдз рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ред
  • рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рд╕рд░реНрд╡рд░ред
  • Websocket рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ RPC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рдкрд░рд┐рд╡рд╣рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди .NET WCF рдХреЗ рд╕рдорд╛рди рд╣реИред
    • рдХреЛрдИ рднреА рд╡рд╕реНрддреБ рдПрдХ рд╕реЗрд╡рд╛ рд╣реИред
    • рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдХреЛ рдореВрд▓реНрдп рдФрд░ рд╕рдВрджрд░реНрдн рджреЛрдиреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  • рдбреЗрдЯрд╛ рдЕрдиреБрд░реЛрдз рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗрд╡рд▓ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░, рдлреЗрд╕рдмреБрдХ рд╕реЗ рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред
  • рджреЛ-рддрд░рдлрд╝рд╛ рд╕рдВрдЪрд╛рд░: рдбреЗрдЯрд╛ рдЕрджреНрдпрддрди рдХрд╛ рдЖрд░рдВрдн рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рд╕реЗ рджреЛрдиреЛрдВ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  • рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб рдХреЛ рдЯрд╛рдЗрдкрдХреНрд░рд┐рд╕рд┐рдкреНрдЯ рдХреЗ рдПрд╕рд┐рдВрдХреНрд╕ / рд╡реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рд╕рд░реНрд╡рд░ рдПрдкреАрдЖрдИ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ: рдпрджрд┐ рдпрд╣ рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд┐рд▓реНрдб рддреБрд░рдВрдд рджрд┐рдЦрд╛рдПрдЧрд╛ред

рдЖрдЙрдЯрдкреБрдЯ рдХреНрдпрд╛ рд╣реИ


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


рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреИрд╕реЗ рд╕рдВрд░рдЪрд┐рдд рд╣реИ


рд╕рд░реНрд╡рд░ рдПрдХ рдореВрд▓ рд╡рд╕реНрддреБ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЧреНрд░рд╛рдл рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХреЗ рдЧреБрдгреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ (рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ, рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕, рдкрдВрдХреНрддрд┐рдпреЛрдВ рдЖрджрд┐ рдХрд╛ рд╕рдВрдЧреНрд░рд╣) рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдХрд╛рд░рдг рд╣реИ, рдЖрд╡реЗрджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рд╕рд╛рде:


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

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


рдЙрджрд╛рд╣рд░рдг рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛:


 //   interface IParent { ServerId: string; Nodes: INodes; // INodes -     INode } //     interface INodes<TNode extends INode> extends ICollection { IndexOf(item: TNode): number; Item(index: number): TNode; // ...     } //    interface INode extends IItem { Guid: string; Name: string; DisplayName: string; Links: ILinks; // ILinks -    Info: INodeInfo; //    -  } //      interface ILink { Guid: string; DisplayName: string; SourceNode: INode; //   -  TargetNode: INode; //   ,   } interface INodeInfo { Component: IComponent; ConfigData: IData; } 

рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдбреЗрдЯрд╛ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ


рдпрд╣ рд╕рд░рд▓ рд╣реИ: рдЬрдм рдЖрдк рдПрдХ рдЧреИрд░-рд╕реНрдХреЗрд▓рд░ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрд░рдкреАрд╕реА рд░рд┐рдЯрд░реНрди Promise :


 let Nodes = Parent.Nodes; // Nodes -> Promise<INodes> 

рдПрдХ "рдХреЙрд▓рдмреИрдХ рд╣реЗрд▓" рдХреЗ рдмрд┐рдирд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХред


"рдЕрдиреБрдХреНрд░рдорд┐рдХ" рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ async / await рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


 async function ShowNodes(parent: IParent): Promise<void> { //    let Nodes = await parent.Nodes; //       await Nodes.forEachParallel(async function(node): Promise<void> { await RenderNode(node); //          }); } 

рдЗрд╕ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд░рд╣рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рд╣рдм рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╛рдордЧреНрд░реА рд╣реИ ред рд╡реЗ 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 :


 /** *            * @param items  * @param callbackfn  * @param [thisArg]   ,      this  callbackfn */ 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 рдлрд╝рдВрдХреНрд╢рди рдмреЗрд╣рдж рдЧреИрд░-рдЗрд╖реНрдЯрддрдо рджрд┐рдЦрддрд╛ рд╣реИ: рдЬрдм рд╣рдо рдХрд┐рд╕реА рдЕрдиреНрдп рдЗрдХрд╛рдИ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╣рд░ рдмрд╛рд░ рдЗрд╕рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред рд╕реБрд╡рд┐рдзрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рддрд░реАрдХрд╛ рддреЗрдЬреА рд╕реЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИред рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдЖрдкрдХреЛ рд╕рд░реНрд╡рд░ рдХреЛ рдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╡реЗрд░реА рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рдХреНрд╡реЗрд░реА рднрд╛рд╖рд╛


рдХрдИ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ рд╕рд░реНрд╡рд░ рд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╡реЗ "рдмрддрд╛" рд╕рд░реНрд╡рд░ рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд▓реМрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдЧреНрд░рд╛рдл рдХреЗ рдиреЛрдбреНрд╕:


 /** *       item    Promise  , *      properties */ selectAsync<T extends IItem>(item: T, properties: () => any[]): Promise<T>; /** *   items,       properties */ selectAsyncAll<T extends ICollection>(items: T[], properties: () => any[]): Promise<T[]>; /**    selectAsync     */ select<T>(item: T, properties: () => any[]): T; /**    selectAsync     */ selectAll<T>(items: T[], properties: () => any[]): T[]; 

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


 async function ShowNodes(parentPoint: IParent): Promise<void> { //       IParent -    selectAsync ( // Promise,  ). let Parent = await selectAsync(parentPoint, parent => [ //           selectAll(parent.Nodes, nodes => [node.Name, node.DisplayName]) // [node.Name, node.DisplayName] -        ]); //      Parent.Nodes ... } 

рдЧрд╣рд░рд╛рдИ рд╕реЗ рдПрдореНрдмреЗрдбреЗрдб рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдереЛрдбрд╝реА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХреНрд╡реЗрд░реА рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:


 //     parent.Nodes  selectAsyncAll,    let Parent = await selectAsyncAll(parent.Nodes, nodes => [ //    : select(node, node => [ node.Name, node.DisplayName, selectAll(node.Links, link => [ link.Guid, link.DisplayName, select(link.TargetNode, targetNode => [targetNode.Guid]) ]), select(node.Info, info => [info.Component]) //    IInfo    IComponent,   ,   ,        ]) ]); 

рдХреНрд╡реЗрд░реА рднрд╛рд╖рд╛ рд╕рд░реНрд╡рд░ рд╕реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЕрдиреБрд░реЛрдзреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреА рд╣реИред рд▓реЗрдХрд┐рди рдХреЛрдб рдХрднреА рднреА рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрдИ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдЕрдиреБрд░реЛрдз рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ред


рд░реЗрд╕ рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рд╕рдорд╛рдзрд╛рди


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


рдРрд╕реА рд╕рд░рд▓реАрдХреГрдд рд╕реНрдерд┐рддрд┐ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ: IParent рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ IParent рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╣реИред


 /**   */ Parent.OnSynchronize.AddListener(async function(): Promise<void> { //  .   ,  . }); 

рдпрд╣ рддрдм рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╕рд░реНрд╡рд░ рдкрд░ INodes рдиреЛрдбреНрд╕ рдХреА рд╕реВрдЪреА рдЕрдкрдбреЗрдЯ рдХреА рдЬрд╛рддреА рд╣реИред рдлрд┐рд░, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ, рдПрдХ рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рд╕рдВрднрд╡ рд╣реИ:


  1. рд╣рдо рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдиреЛрдб рдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреЗ рд╣реИрдВ, рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ
     async function OnClickRemoveNode(node: INode): Promise<void> { let removedOnServer: boolean = await Parent.RemoveNode(node); //     if (removedOnServer) .... } 
  2. Parent.OnSynchronize рдорд╛рдзреНрдпрдо рд╕реЗ, рдиреЛрдб рд╕реВрдЪреА рдШрдЯрдирд╛ рдХрд╛ рдПрдХ рдЕрджреНрдпрддрди рд╣реЛрддрд╛ рд╣реИред
  3. Parent.OnSynchronize рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ Parent.OnSynchronize рд╣реИ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред
  4. async OnClickRemoveNode() рдкрд╣рд▓реЗ await рдмрд╛рдж рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж async OnClickRemoveNode() рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЖрдк OnClickRemoveNode рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдкрд░ рдПрдХ рдЪреЗрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рд╕рд░рд▓реАрдХреГрдд рдЙрджрд╛рд╣рд░рдг рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рд╕рдорд╛рди рдЬрд╛рдБрдЪ рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдХреЙрд▓ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ? рдЗрд╕рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ await рдмрд╛рдж рдПрдХ рд╕рдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреБрд░рд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИ:


  • рдЗрддрдирд╛ рдлреВрд▓рд╛ рд╣реБрдЖ рдХреЛрдб рд╕рдорд░реНрдерди рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд┐рдП рдЬрдЯрд┐рд▓ рд╣реИред
  • рдХреЛрдб рдЗрд░рд╛рджрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ: OnClickRemoveNode рдореЗрдВ рд╡рд┐рд▓реЛрдкрди OnClickRemoveNode , рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рд▓реЛрдкрди рдХрд╣реАрдВ рдФрд░ рд╣реЛрддрд╛ рд╣реИред рдбреЗрд╡рд▓рдкрд░ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдкреНрд░рддрд┐рдЧрдорди рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрдВрдЧреАред
  • рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдирд╣реАрдВ рд╣реИ: рдпрджрд┐ рдЖрдк рдХрд╣реАрдВ рдЪреЗрдХ рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреАред рдЦрддрд░рд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдХрд┐ рдПрдХ рднреВрд▓реА рд╣реБрдИ рдЬрд╛рдБрдЪ рд╕реНрдерд╛рдиреАрдп рд╕реНрддрд░ рдкрд░ рдФрд░ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдФрд░ рдЕрдзрд┐рдХ рд▓рдВрдмреА рдиреЗрдЯрд╡рд░реНрдХ рджреЗрд░реА рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╣реЛрдЧрд╛ред
  • рдФрд░ рдЕрдЧрд░ рдирд┐рдпрдВрддреНрд░рдХ рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ рдпреЗ рд╣реИрдВрдбрд▓рд░ рд╣реИрдВ, рдЙрд╕реЗ рдирд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдмрд╛рдж рдЗрд╕рдХреЗ рд╡рд┐рдирд╛рд╢ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП await рдХрд░ рд░рд╣рд╛ рд╣реИ

рдПрдХ рдФрд░ рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ: рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╕рдорд╛рди рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛рддреНрдордХ рддрд░реАрдХреЗ рд╣реИрдВ? рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдФрд░ рднреА рд╣реИрдВ:


  • рдПрдХ рдиреЛрдб рдЬреЛрдбрд╝рдирд╛
  • рдиреЛрдб рдЕрдкрдбреЗрдЯ
  • рд▓рд┐рдВрдХ рдЬреЛрдбрд╝реЗрдВ / рдирд┐рдХрд╛рд▓реЗрдВ
  • рдПрдХрд╛рдзрд┐рдХ рдиреЛрдб рд░реВрдкрд╛рдВрддрд░рдг рд╡рд┐рдзрд┐
  • рдЖрд╡реЗрджрди рдХрд╛ рдЬрдЯрд┐рд▓ рд╡реНрдпрд╡рд╣рд╛рд░: рд╣рдо рдПрдХ рдиреЛрдб рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ рдФрд░ рд╕рд░реНрд╡рд░ рдЙрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдиреЛрдбреНрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИред

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


рд╣рдо рдРрд╕реЗ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдФрд░ рдкреНрд░рдореБрдЦ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:


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

       window.addEventListener('unhandledrejection', function(event) { // handling... }); 
    • рдЪреВрдБрдХрд┐ рд╣рдо рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдЪреНрдЪрддрдо async рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд╕рдВрдкреВрд░реНрдг рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред

рдЕрдм рд╣рдо рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдРрд╕реЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреА рдПрдХ рдЕрдиреБрдорд╛рдирд┐рдд рд╕реВрдЪреА рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


 /** * : * 1.      * 2.      ,   . * *  ,  :   ,         */ @Lock /** * : *     ,     . * *  ,     :   ,   . */ @LockQueue /** *  LockQueue .  -         * *   ,       . ,   . */ @LockBetween /** * : *       ,   . *     . :     ,     300 .       . */ @LockDeferred(300) // ,    ,     : interface ILockTarget { /** * ,   View,   .   ,        ,     ,        */ GetControllerView?(): IView; /**  true     */ IsDestroyed: boolean; } 

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


 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> { ... } /**    -    (/warning/error/...) */ @LockQueue private async OnServerUpdateNodeStatus(): Promise<void> { ... } /**       */ @LockDeferred(300) private async OnSearchFieldChange(): Promise<void> { ... } } 

рдЕрдм рд╣рдо рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдФрд░ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдирдХреЗ рдЙрдиреНрдореВрд▓рди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ:


  1. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ: OnClickRemoveNode , OnClickRemoveLink ред рдЙрдЪрд┐рдд рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдХрддрд╛рд░ рдореЗрдВ (рдпрд╛ рддреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдпрд╛ рд╕рд░реНрд╡рд░) рдХреЛрдИ рдЕрдиреНрдп рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реИрдВрдбрд▓рд░ рдирд╣реАрдВ рд╣реИрдВред рдЕрдиреНрдпрдерд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд╕реА рддреНрд░реБрдЯрд┐ рд╕рдВрднрд╡ рд╣реИ:
    • рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдореЙрдбрд▓ рдЕрднреА рднреА рд╡рд░реНрддрдорд╛рди рд╕рд░реНрд╡рд░ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
    • рд╣рдо рдЕрджреНрдпрддрди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдкрд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ (рдХрддрд╛рд░ рдореЗрдВ OnServerSynchronize рдореЗрдВ рдПрдХ OnServerSynchronize рд╣реИрдВрдбрд▓рд░ рд╣реИ)ред рд▓реЗрдХрд┐рди рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдм рдирд╣реАрдВ рд╣реИ - рдмрд╕ рдкреВрд░реНрдг рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдЕрднреА рддрдХ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ рдФрд░ рдпрд╣ рдЕрднреА рднреА рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред
      рдЗрд╕рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рд╢реБрд░реВ рдХреА рдЧрдИ рд╕рднреА рдХреНрд░рд┐рдпрд╛рдПрдВ, Lock рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рдХрддрд╛рд░ рдореЗрдВ рдЕрдиреНрдп рд╣реИрдВрдбрд▓рд░ рд╕рдорд╛рди рдХрддрд╛рд░ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рд╣реИрдВред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╕рд░реНрд╡рд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИ, рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рд╣рд╛рдВ, Websocket рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдЕрдиреБрдХреНрд░рдо рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред
  2. рд╣рдо рдПрдХ рдиреЛрдб рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЖрд░рдВрдн рдХрд░рддреЗ рд╣реИрдВ: OnClickAddNewNode ред OnServerSynchronize , OnServerAddNode рдИрд╡реЗрдВрдЯ рд╕рд░реНрд╡рд░ рд╕реЗ рдЖрддреЗ рд╣реИрдВред
    • OnClickAddNewNode рдиреЗ рдХрддрд╛рд░ OnClickAddNewNode (рдпрджрд┐ рдЗрд╕рдореЗрдВ рдХреБрдЫ рдерд╛, рддреЛ рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ Lock рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЙрд▓ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджреЗрдЧрд╛)
    • OnClickAddNewNode , OnClickAddNewNode OnServerAddNode , OnClickAddNewNode рдмрд╛рдж рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд, рдЗрд╕рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдирд╣реАрдВред
  3. рдХрддрд╛рд░ рдореЗрдВ OnServerSynchronize рдФрд░ OnServerUpdateNode ред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдкрд╣рд▓реЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ GraphController рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред рдлрд┐рд░ OnServerUpdateNode рджреВрд╕рд░реА рдХреЙрд▓ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдирд╖реНрдЯ рдирд┐рдпрдВрддреНрд░рдХ рдкрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рди рд╣реЛ, рдЬреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрдирдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, ILockTarget рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ IsDestroyed - рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХрддрд╛рд░ рд╕реЗ рдЕрдЧрд▓реЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдзреНрд╡рдЬ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред
    рд▓рд╛рдн: рдкреНрд░рддреНрдпреЗрдХ await рдмрд╛рдж if (!this.IsDestroyed()) рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
  4. рдХрдИ рдиреЛрдбреНрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред OnServerSynchronize , OnServerUpdateNode рдИрд╡реЗрдВрдЯ рд╕рд░реНрд╡рд░ рд╕реЗ рдЖрддреЗ рд╣реИрдВред рдЙрдирдХреЗ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдирд┐рд╖реНрдкрд╛рджрди рд╕реЗ рдЕрдкреВрд░рдгреАрдп рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрдВрдЧреАред рд▓реЗрдХрд┐рди рдХрдм рд╕реЗ LockQueue рд╡реЗ LockQueue рдФрд░ LockBetween рджреНрд╡рд╛рд░рд╛ рдЪрд┐рд╣реНрдирд┐рдд рд╣реИрдВ, LockQueue рдЙрдиреНрд╣реЗрдВ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
  5. рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдиреЛрдбреНрд╕ рдХреЗ рдЕрдВрджрд░ рдиреЗрд╕реНрдЯреЗрдб рдиреЛрдб рдЧреНрд░рд╛рдл рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред GraphController #1 , тАФ GraphController #2 . , GraphController - , ( тАФ ), .. . :
    • GraphController #2 , , .
  6. OnSearchFieldChange , . - . @LockDeferred(300) 300 : , , 300 . , . :
    • , 500 , . тАФ OnSearchFieldChange , .
    • OnSearchFieldChange тАФ , .


  1. Deadlock: Handler1 , , await Handler2 , LockQueue , Handler2 тАФ Handler1 .
  2. , 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); } } 

:


  1. RunBigDataCalculations .
  2. await Start();
  3. / ( )
  4. await Start(); , await UpdateSmth(); .

:


  1. RunBigDataCalculations .
  2. OnChangeNodeState , (.. ).
  3. await GetNodeData(node);
  4. / ( )
  5. await GetNodeData(node); , await UpdateNode(node); .

- . :


  • :

 /** *       ,      */ export interface IQueuedDisposableLockTarget extends ILockTarget { /**     . Lock          IsDisposing() === true */ IsDisposing(): boolean; SetDisposing(): void; } 

  • :

 function QueuedDispose(controller: IQueuedDisposableLockTarget): void { //      let xQueue = GetQueue(controller); // 1. ,     -,   -   if (xQueue.Empty) { controller.Dispose(); return; } // 2.  ,     " ",     ,   . controller.SetDisposing(); // 3.   finally   xQueue.finally(() => { debug.assert(!IsDisposed(controller), "-      ,  "); controller.Dispose(); }); } 

, . QueuedDispose :


  • . .
  • QueuedDispose controller . тАФ ExtJS .


, , .. . , ? , .


, :


vk.com
Telegram

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


All Articles