スケーラブルなTypeScriptアプリケーションの構築。 パート2.5-バグとデリゲートに関する作業

パート1: モジュールの非同期読み込み

パート2: イベント、または自分の自転車を再発明する理由



残念ながら、モスクワの暑さは記事の第2部の執筆中に私の注意力に深刻な影響を及ぼし、それが1つの不快なミスを引き起こしました。



しかし、バグに関する作業を書くだけでは面白くないでしょう。 幸いなことに、それを修正するプロセス自体が、私がコミュニティの判断に持ち込みたい興味深い発見と考えをいくつか投げました。



だから、私のWinAmpはOzzy Osbourneのヒット曲のコレクションを再生します。



エラー




記事の第2部の「イベントパラメーターの入力」セクションで、次のコードが公開されました(ここにCodeplexの完全なコードがあります )。



export class Event<Callback extends Function, Options> { private Callbacks: Callback[] = []; public Add(callback: Callback): ITypedSubscription<Callback, Event<Callback, Options>> { var that = this; var res: ITypedSubscription<Callback, Event<Callback, Options>> = { Callback: callback, Event: that, Unsubscribe: function () { that.Remove(callback); } } this.Callbacks.push(callback); return res; } public Remove(callback: Callback): void { var filteredList: Callback[] = []; for (var i = 0; i < this.Callbacks.length; i++) { //  .     if (this.Callbacks[i] !== callback) { filteredList.push(callback); } } this.Callbacks = filteredList; } public Trigger(options: Options): void { for (var i = 0; i < this.Callbacks.length; i++) { this.Callbacks[i](options); } } }
      
      







エラーは、 Event



クラスの署名にありました。



 Event<Callback extends Function, Options>
      
      







型のレベルでは、一般化されたパラメーター間にはまったく関係がありません。 実際、 Callback



型の最初の引数は特定のシグネチャを持たない任意の関数であり、Type型の2番目の引数はオブジェクト型であり、イベントに追加されたコールバックを呼び出すために使用されることがわかりました。 つまり パラメータは相互接続されていません。この実装では、これらのパラメータに同意せずに自分の足を撃つことは基本です。経験の浅い開発者はおそらくそうしません。



そして、ストリートマジックが始まります。



デリゲート




ロシアのウィキペディアは次のように語っています。



デリゲート-.NET Frameworkのメソッド(静的またはクラスインスタンス)を指すデータ構造。 デリゲートは、特に、.NET Frameworkのイベントモデルなどで、コールバック関数のプロトタイプを定義するために使用されます。



さらに、英語版では、デリゲートはタイプセーフな関数ポインターであることが示されています。 関数への厳密に型指定された参照(翻訳および解釈不要)。



コンテキストに応じて、デリゲートはタイプまたは特定のインスタンスのいずれかを意味すると理解できます。



簡単に言えば、JSの世界により近い、厳密に定義された型の関数を格納する強く型付けされた変数です。 つまり、デリゲートはメソッドのシグネチャを厳密に定義します。



JSには明示的なデリゲートはありません。 すべての関数はオブジェクトであり、動的な型付けですらあります。 これは、JSが追加のジェスチャーなしでデリゲートをサポートすることを意味します。



TSのデリゲートの例は、次の例のコールバックパラメーターです。



 function Boo(callback: (strings: string[]) => string) { /*  */ }
      
      







ここでは、コールバックパラメーターを、文字列の配列の型の必須パラメーターを厳密に1つ取るメソッドとして厳密に類型化します。



しかし、そのような記録は私たちには適していない、なぜなら イベントの宣言に基づいて入力できる汎用デリゲートが必要です。



最初に、デリゲートを再利用するために型として宣言する必要があります。 驚いたことに、TS 0.9仕様と全能のGoogleは、このような構造の構文を決定するのに役立ちませんでした。 答えは、Codeplexでの検索の2時間目のTSの議論で見つかりました。



 export interface IDelegateTest { (options: any); } var test: IDelegateTest = function (options: any) { }
      
      







このエントリを使用して、IDelegateTestインターフェイスがany型のパラメーターを1つ持つデリゲート型であることを宣言します。 この場合、パラメーターの名前は変更できますが、数量とタイプは変更できません。 たとえば、次のコードは完全に正しいです。



 // var test: IDelegateTest = function (settings: any) { }
      
      







このように:



 //  var test: IDelegateTest = function (options?: any) { }
      
      







そして、これでも:



 //   ,     var test: IDelegateTest = function () { }
      
      







またはこれ:



 // !!! var test: IDelegateTest = function (options: number) { }
      
      







「やめて!」注意深い読者が言うでしょう。 すべきでないことを変えています。 回答: options



any



として宣言され、すべてを許可します。 正直に言って、私は「3本の松」でその理由を理解するまで約10分を費やしました。 誰もこのtrapに落ちないことを願っています。



そして、すべてが正しい:



 export interface IDelegateTest { //   (options: string); } // Cannot convert '(options: number) => void' to 'IDelegateTest' var test1: IDelegateTest = function (options: number) { } //Call signatures of types '(options?: number) => void' and 'IDelegateTest' are incompatible. var test2: IDelegateTest = function (options?: number) { } //   var test3: IDelegateTest = function (settings: string) { }
      
      







次に、デリゲートを一般的なものにリメイクし、正しい名前を付けます。 すべてが構文の観点から、そして単純に期待されています:



 export interface ICallback<ArgType> { (arg: ArgType, context?: any); }
      
      







options



パラメーターは型付きパラメーターであり、 context



により、イベントを引き起こしたオブジェクトを指定できます。これは、イベントが3番目のオブジェクトによって呼び出され、これを監視する必要がある場合に役立ちます。 同じBackbone.Eventsとは異なり、コンテキストはサブスクライバーから制御されないことに注意してください。同じBackbone.Eventsでは、同じタイプのハンドラーを分離するためにサブスクライバーによってコンテキストが設定されます。



このコードには暗黙的なポイントが1つあります。 C#:( (object sender, EventArgs args)



の伝統に従って、最初にcontext



を宣言すると、TSコンパイラは関数型の対応を追跡できなくなります。 バグか機能かはわかりませんが、注意が必要です。 入力したパラメーターが先頭にある場合、すべてが予測どおりに機能します。 記事の文脈で私に完全に合っているもの。



修正されたイベント




次のインターフェイスを追加します。



 export interface ICallbackDesc<ArgType> { Callback: ICallback<ArgType>; Subscriber: any; }
      
      







コールバックを呼び出すコンテキストに関する情報を保存するには、 ICallbackDesc



が必要にICallbackDesc



ます。 つまり コールバックでどの値を取得する必要があるのか​​を覚えておく必要があります。そうしないと、完全に機能できなくなります。



Event



クラスを調整します。



 export class Event<ArgType> { private Callbacks: ICallbackDesc<ArgType>[] = []; /**    * @param {ICallback<ArgType>} callback Callback,       * @param {any} subscriber ,      callback * @returns {ITypedSubscription<ArgType>}    */ public Subscribe(callback: ICallback<ArgType>, subscriber: any): ITypedSubscription<ArgType> { var that = this; var res: ITypedSubscription<ArgType> = { Callback: callback, Event: that, Unsubscribe: function () { that.Unsubscribe(callback); } } this.Callbacks.push({ Callback: callback, Subscriber: subscriber }); return res; } public Unsubscribe(callback: ICallback<ArgType>): void { //  } public Trigger(arg: ArgType, context?: any): void { //  } }
      
      







出力ICallback.



Trigger :



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { // }







, :



export class MessagesRepo { public MessagesLoaded = new Events.Event<string[]>(); public ErrorHappened = new Events.Event<ErrorHappenedOptions>(); }







:



public Subscribe() { // this.Subscriptions.push(MessagesRepoInstance.MessagesLoaded.Subscribe(function (messages: string[], context?: any) { alert(messages && messages.length > 0 ? messages[0] : 'Nothing'); }, this)); // this.Subscriptions.push(MessagesRepoInstance.ErrorHappened.Subscribe(function (error: ErrorHappenedOptions) { alert(error.Error); }, this)); }







// context subscriber.MessagesRepo.MessagesLoaded.Trigger(['Test message 1'], this); // subscriber.MessagesRepo.ErrorHappened.Trigger({ Error: 'Test error 1' });







Unsubscribe



:



public Unsubscribe(callback: ICallback<ArgType>): void { var filteredList: ICallbackDesc<ArgType>[] = []; for (var i = 0; i < this.Callbacks.length; i++) { if (this.Callbacks[i].Callback !== callback) { filteredList.push(this.Callbacks[i]); } } this.Callbacks = filteredList; }







!==



. . () - , . , , Unsubscribe



. .. .., , , . .



? . , JS , , TS, . - .



.. :



public static Main(): void { var subscriber1: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); var subscriber2: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); subscriber1.Subscribe(); subscriber2.Subscribe(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 1'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 1' }); subscriber1.Destroy(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 2'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 2' }); }







2 'Test message 1' 'Test error 1', 'Test message 2' 'Test error 2'.







apply:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { var callbacks: ICallbackDesc<ArgType>[] = this.Callbacks; for (var i = 0; i < callbacks.length; i++) { callbacks[i].Callback.apply(callbacks[i].Subscriber, [arg, context]); } }







. .



Upd. . .








Callback



Delegate



名前が変更された)が常にICallback.



Trigger :



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { // }







, :



export class MessagesRepo { public MessagesLoaded = new Events.Event<string[]>(); public ErrorHappened = new Events.Event<ErrorHappenedOptions>(); }







:



public Subscribe() { // this.Subscriptions.push(MessagesRepoInstance.MessagesLoaded.Subscribe(function (messages: string[], context?: any) { alert(messages && messages.length > 0 ? messages[0] : 'Nothing'); }, this)); // this.Subscriptions.push(MessagesRepoInstance.ErrorHappened.Subscribe(function (error: ErrorHappenedOptions) { alert(error.Error); }, this)); }







// context subscriber.MessagesRepo.MessagesLoaded.Trigger(['Test message 1'], this); // subscriber.MessagesRepo.ErrorHappened.Trigger({ Error: 'Test error 1' });







Unsubscribe



:



public Unsubscribe(callback: ICallback<ArgType>): void { var filteredList: ICallbackDesc<ArgType>[] = []; for (var i = 0; i < this.Callbacks.length; i++) { if (this.Callbacks[i].Callback !== callback) { filteredList.push(this.Callbacks[i]); } } this.Callbacks = filteredList; }







!==



. . () - , . , , Unsubscribe



. .. .., , , . .



? . , JS , , TS, . - .



.. :



public static Main(): void { var subscriber1: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); var subscriber2: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); subscriber1.Subscribe(); subscriber2.Subscribe(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 1'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 1' }); subscriber1.Destroy(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 2'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 2' }); }







2 'Test message 1' 'Test error 1', 'Test message 2' 'Test error 2'.







apply:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { var callbacks: ICallbackDesc<ArgType>[] = this.Callbacks; for (var i = 0; i < callbacks.length; i++) { callbacks[i].Callback.apply(callbacks[i].Subscriber, [arg, context]); } }







. .



Upd. . .








インターフェイスを実装することをICallback.



Trigger :



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { // }







, :



export class MessagesRepo { public MessagesLoaded = new Events.Event<string[]>(); public ErrorHappened = new Events.Event<ErrorHappenedOptions>(); }







:



public Subscribe() { // this.Subscriptions.push(MessagesRepoInstance.MessagesLoaded.Subscribe(function (messages: string[], context?: any) { alert(messages && messages.length > 0 ? messages[0] : 'Nothing'); }, this)); // this.Subscriptions.push(MessagesRepoInstance.ErrorHappened.Subscribe(function (error: ErrorHappenedOptions) { alert(error.Error); }, this)); }







// context subscriber.MessagesRepo.MessagesLoaded.Trigger(['Test message 1'], this); // subscriber.MessagesRepo.ErrorHappened.Trigger({ Error: 'Test error 1' });







Unsubscribe



:



public Unsubscribe(callback: ICallback<ArgType>): void { var filteredList: ICallbackDesc<ArgType>[] = []; for (var i = 0; i < this.Callbacks.length; i++) { if (this.Callbacks[i].Callback !== callback) { filteredList.push(this.Callbacks[i]); } } this.Callbacks = filteredList; }







!==



. . () - , . , , Unsubscribe



. .. .., , , . .



? . , JS , , TS, . - .



.. :



public static Main(): void { var subscriber1: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); var subscriber2: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); subscriber1.Subscribe(); subscriber2.Subscribe(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 1'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 1' }); subscriber1.Destroy(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 2'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 2' }); }







2 'Test message 1' 'Test error 1', 'Test message 2' 'Test error 2'.







apply:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { var callbacks: ICallbackDesc<ArgType>[] = this.Callbacks; for (var i = 0; i < callbacks.length; i++) { callbacks[i].Callback.apply(callbacks[i].Subscriber, [arg, context]); } }







. .



Upd. . .








ますICallback.



Trigger :



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { // }







, :



export class MessagesRepo { public MessagesLoaded = new Events.Event<string[]>(); public ErrorHappened = new Events.Event<ErrorHappenedOptions>(); }







:



public Subscribe() { // this.Subscriptions.push(MessagesRepoInstance.MessagesLoaded.Subscribe(function (messages: string[], context?: any) { alert(messages && messages.length > 0 ? messages[0] : 'Nothing'); }, this)); // this.Subscriptions.push(MessagesRepoInstance.ErrorHappened.Subscribe(function (error: ErrorHappenedOptions) { alert(error.Error); }, this)); }







// context subscriber.MessagesRepo.MessagesLoaded.Trigger(['Test message 1'], this); // subscriber.MessagesRepo.ErrorHappened.Trigger({ Error: 'Test error 1' });







Unsubscribe



:



public Unsubscribe(callback: ICallback<ArgType>): void { var filteredList: ICallbackDesc<ArgType>[] = []; for (var i = 0; i < this.Callbacks.length; i++) { if (this.Callbacks[i].Callback !== callback) { filteredList.push(this.Callbacks[i]); } } this.Callbacks = filteredList; }







!==



. . () - , . , , Unsubscribe



. .. .., , , . .



? . , JS , , TS, . - .



.. :



public static Main(): void { var subscriber1: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); var subscriber2: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); subscriber1.Subscribe(); subscriber2.Subscribe(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 1'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 1' }); subscriber1.Destroy(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 2'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 2' }); }







2 'Test message 1' 'Test error 1', 'Test message 2' 'Test error 2'.







apply:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { var callbacks: ICallbackDesc<ArgType>[] = this.Callbacks; for (var i = 0; i < callbacks.length; i++) { callbacks[i].Callback.apply(callbacks[i].Subscriber, [arg, context]); } }







. .



Upd. . .








ICallback.



Trigger




:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { // }







, :



export class MessagesRepo { public MessagesLoaded = new Events.Event<string[]>(); public ErrorHappened = new Events.Event<ErrorHappenedOptions>(); }







:



public Subscribe() { // this.Subscriptions.push(MessagesRepoInstance.MessagesLoaded.Subscribe(function (messages: string[], context?: any) { alert(messages && messages.length > 0 ? messages[0] : 'Nothing'); }, this)); // this.Subscriptions.push(MessagesRepoInstance.ErrorHappened.Subscribe(function (error: ErrorHappenedOptions) { alert(error.Error); }, this)); }







// context subscriber.MessagesRepo.MessagesLoaded.Trigger(['Test message 1'], this); // subscriber.MessagesRepo.ErrorHappened.Trigger({ Error: 'Test error 1' });







Unsubscribe



:



public Unsubscribe(callback: ICallback<ArgType>): void { var filteredList: ICallbackDesc<ArgType>[] = []; for (var i = 0; i < this.Callbacks.length; i++) { if (this.Callbacks[i].Callback !== callback) { filteredList.push(this.Callbacks[i]); } } this.Callbacks = filteredList; }







!==



. . () - , . , , Unsubscribe



. .. .., , , . .



? . , JS , , TS, . - .



.. :



public static Main(): void { var subscriber1: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); var subscriber2: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); subscriber1.Subscribe(); subscriber2.Subscribe(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 1'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 1' }); subscriber1.Destroy(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 2'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 2' }); }







2 'Test message 1' 'Test error 1', 'Test message 2' 'Test error 2'.







apply:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { var callbacks: ICallbackDesc<ArgType>[] = this.Callbacks; for (var i = 0; i < callbacks.length; i++) { callbacks[i].Callback.apply(callbacks[i].Subscriber, [arg, context]); } }







. .



Upd. . .




 ICallback. 
      



Trigger




:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { // }







, :



export class MessagesRepo { public MessagesLoaded = new Events.Event<string[]>(); public ErrorHappened = new Events.Event<ErrorHappenedOptions>(); }







:



public Subscribe() { // this.Subscriptions.push(MessagesRepoInstance.MessagesLoaded.Subscribe(function (messages: string[], context?: any) { alert(messages && messages.length > 0 ? messages[0] : 'Nothing'); }, this)); // this.Subscriptions.push(MessagesRepoInstance.ErrorHappened.Subscribe(function (error: ErrorHappenedOptions) { alert(error.Error); }, this)); }







// context subscriber.MessagesRepo.MessagesLoaded.Trigger(['Test message 1'], this); // subscriber.MessagesRepo.ErrorHappened.Trigger({ Error: 'Test error 1' });







Unsubscribe



:



public Unsubscribe(callback: ICallback<ArgType>): void { var filteredList: ICallbackDesc<ArgType>[] = []; for (var i = 0; i < this.Callbacks.length; i++) { if (this.Callbacks[i].Callback !== callback) { filteredList.push(this.Callbacks[i]); } } this.Callbacks = filteredList; }







!==



. . () - , . , , Unsubscribe



. .. .., , , . .



? . , JS , , TS, . - .



.. :



public static Main(): void { var subscriber1: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); var subscriber2: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); subscriber1.Subscribe(); subscriber2.Subscribe(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 1'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 1' }); subscriber1.Destroy(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 2'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 2' }); }







2 'Test message 1' 'Test error 1', 'Test message 2' 'Test error 2'.







apply:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { var callbacks: ICallbackDesc<ArgType>[] = this.Callbacks; for (var i = 0; i < callbacks.length; i++) { callbacks[i].Callback.apply(callbacks[i].Subscriber, [arg, context]); } }







. .



Upd. . .




ICallback.



Trigger




:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { // }







, :



export class MessagesRepo { public MessagesLoaded = new Events.Event<string[]>(); public ErrorHappened = new Events.Event<ErrorHappenedOptions>(); }







:



public Subscribe() { // this.Subscriptions.push(MessagesRepoInstance.MessagesLoaded.Subscribe(function (messages: string[], context?: any) { alert(messages && messages.length > 0 ? messages[0] : 'Nothing'); }, this)); // this.Subscriptions.push(MessagesRepoInstance.ErrorHappened.Subscribe(function (error: ErrorHappenedOptions) { alert(error.Error); }, this)); }







// context subscriber.MessagesRepo.MessagesLoaded.Trigger(['Test message 1'], this); // subscriber.MessagesRepo.ErrorHappened.Trigger({ Error: 'Test error 1' });







Unsubscribe



:



public Unsubscribe(callback: ICallback<ArgType>): void { var filteredList: ICallbackDesc<ArgType>[] = []; for (var i = 0; i < this.Callbacks.length; i++) { if (this.Callbacks[i].Callback !== callback) { filteredList.push(this.Callbacks[i]); } } this.Callbacks = filteredList; }







!==



. . () - , . , , Unsubscribe



. .. .., , , . .



? . , JS , , TS, . - .



.. :



public static Main(): void { var subscriber1: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); var subscriber2: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); subscriber1.Subscribe(); subscriber2.Subscribe(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 1'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 1' }); subscriber1.Destroy(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 2'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 2' }); }







2 'Test message 1' 'Test error 1', 'Test message 2' 'Test error 2'.







apply:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { var callbacks: ICallbackDesc<ArgType>[] = this.Callbacks; for (var i = 0; i < callbacks.length; i++) { callbacks[i].Callback.apply(callbacks[i].Subscriber, [arg, context]); } }







. .



Upd. . .




 ICallback. 
      



Trigger




:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { // }







, :



export class MessagesRepo { public MessagesLoaded = new Events.Event<string[]>(); public ErrorHappened = new Events.Event<ErrorHappenedOptions>(); }







:



public Subscribe() { // this.Subscriptions.push(MessagesRepoInstance.MessagesLoaded.Subscribe(function (messages: string[], context?: any) { alert(messages && messages.length > 0 ? messages[0] : 'Nothing'); }, this)); // this.Subscriptions.push(MessagesRepoInstance.ErrorHappened.Subscribe(function (error: ErrorHappenedOptions) { alert(error.Error); }, this)); }







// context subscriber.MessagesRepo.MessagesLoaded.Trigger(['Test message 1'], this); // subscriber.MessagesRepo.ErrorHappened.Trigger({ Error: 'Test error 1' });







Unsubscribe



:



public Unsubscribe(callback: ICallback<ArgType>): void { var filteredList: ICallbackDesc<ArgType>[] = []; for (var i = 0; i < this.Callbacks.length; i++) { if (this.Callbacks[i].Callback !== callback) { filteredList.push(this.Callbacks[i]); } } this.Callbacks = filteredList; }







!==



. . () - , . , , Unsubscribe



. .. .., , , . .



? . , JS , , TS, . - .



.. :



public static Main(): void { var subscriber1: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); var subscriber2: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); subscriber1.Subscribe(); subscriber2.Subscribe(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 1'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 1' }); subscriber1.Destroy(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 2'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 2' }); }







2 'Test message 1' 'Test error 1', 'Test message 2' 'Test error 2'.







apply:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { var callbacks: ICallbackDesc<ArgType>[] = this.Callbacks; for (var i = 0; i < callbacks.length; i++) { callbacks[i].Callback.apply(callbacks[i].Subscriber, [arg, context]); } }







. .



Upd. . .




ICallback.



Trigger




:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { // }







, :



export class MessagesRepo { public MessagesLoaded = new Events.Event<string[]>(); public ErrorHappened = new Events.Event<ErrorHappenedOptions>(); }







:



public Subscribe() { // this.Subscriptions.push(MessagesRepoInstance.MessagesLoaded.Subscribe(function (messages: string[], context?: any) { alert(messages && messages.length > 0 ? messages[0] : 'Nothing'); }, this)); // this.Subscriptions.push(MessagesRepoInstance.ErrorHappened.Subscribe(function (error: ErrorHappenedOptions) { alert(error.Error); }, this)); }







// context subscriber.MessagesRepo.MessagesLoaded.Trigger(['Test message 1'], this); // subscriber.MessagesRepo.ErrorHappened.Trigger({ Error: 'Test error 1' });







Unsubscribe



:



public Unsubscribe(callback: ICallback<ArgType>): void { var filteredList: ICallbackDesc<ArgType>[] = []; for (var i = 0; i < this.Callbacks.length; i++) { if (this.Callbacks[i].Callback !== callback) { filteredList.push(this.Callbacks[i]); } } this.Callbacks = filteredList; }







!==



. . () - , . , , Unsubscribe



. .. .., , , . .



? . , JS , , TS, . - .



.. :



public static Main(): void { var subscriber1: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); var subscriber2: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); subscriber1.Subscribe(); subscriber2.Subscribe(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 1'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 1' }); subscriber1.Destroy(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 2'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 2' }); }







2 'Test message 1' 'Test error 1', 'Test message 2' 'Test error 2'.







apply:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { var callbacks: ICallbackDesc<ArgType>[] = this.Callbacks; for (var i = 0; i < callbacks.length; i++) { callbacks[i].Callback.apply(callbacks[i].Subscriber, [arg, context]); } }







. .



Upd. . .




 ICallback. 
      



Trigger




:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { // }







, :



export class MessagesRepo { public MessagesLoaded = new Events.Event<string[]>(); public ErrorHappened = new Events.Event<ErrorHappenedOptions>(); }







:



public Subscribe() { // this.Subscriptions.push(MessagesRepoInstance.MessagesLoaded.Subscribe(function (messages: string[], context?: any) { alert(messages && messages.length > 0 ? messages[0] : 'Nothing'); }, this)); // this.Subscriptions.push(MessagesRepoInstance.ErrorHappened.Subscribe(function (error: ErrorHappenedOptions) { alert(error.Error); }, this)); }







// context subscriber.MessagesRepo.MessagesLoaded.Trigger(['Test message 1'], this); // subscriber.MessagesRepo.ErrorHappened.Trigger({ Error: 'Test error 1' });







Unsubscribe



:



public Unsubscribe(callback: ICallback<ArgType>): void { var filteredList: ICallbackDesc<ArgType>[] = []; for (var i = 0; i < this.Callbacks.length; i++) { if (this.Callbacks[i].Callback !== callback) { filteredList.push(this.Callbacks[i]); } } this.Callbacks = filteredList; }







!==



. . () - , . , , Unsubscribe



. .. .., , , . .



? . , JS , , TS, . - .



.. :



public static Main(): void { var subscriber1: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); var subscriber2: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); subscriber1.Subscribe(); subscriber2.Subscribe(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 1'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 1' }); subscriber1.Destroy(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 2'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 2' }); }







2 'Test message 1' 'Test error 1', 'Test message 2' 'Test error 2'.







apply:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { var callbacks: ICallbackDesc<ArgType>[] = this.Callbacks; for (var i = 0; i < callbacks.length; i++) { callbacks[i].Callback.apply(callbacks[i].Subscriber, [arg, context]); } }







. .



Upd. . .




ICallback.



Trigger




:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { // }







, :



export class MessagesRepo { public MessagesLoaded = new Events.Event<string[]>(); public ErrorHappened = new Events.Event<ErrorHappenedOptions>(); }







:



public Subscribe() { // this.Subscriptions.push(MessagesRepoInstance.MessagesLoaded.Subscribe(function (messages: string[], context?: any) { alert(messages && messages.length > 0 ? messages[0] : 'Nothing'); }, this)); // this.Subscriptions.push(MessagesRepoInstance.ErrorHappened.Subscribe(function (error: ErrorHappenedOptions) { alert(error.Error); }, this)); }







// context subscriber.MessagesRepo.MessagesLoaded.Trigger(['Test message 1'], this); // subscriber.MessagesRepo.ErrorHappened.Trigger({ Error: 'Test error 1' });







Unsubscribe



:



public Unsubscribe(callback: ICallback<ArgType>): void { var filteredList: ICallbackDesc<ArgType>[] = []; for (var i = 0; i < this.Callbacks.length; i++) { if (this.Callbacks[i].Callback !== callback) { filteredList.push(this.Callbacks[i]); } } this.Callbacks = filteredList; }







!==



. . () - , . , , Unsubscribe



. .. .., , , . .



? . , JS , , TS, . - .



.. :



public static Main(): void { var subscriber1: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); var subscriber2: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); subscriber1.Subscribe(); subscriber2.Subscribe(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 1'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 1' }); subscriber1.Destroy(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 2'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 2' }); }







2 'Test message 1' 'Test error 1', 'Test message 2' 'Test error 2'.







apply:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { var callbacks: ICallbackDesc<ArgType>[] = this.Callbacks; for (var i = 0; i < callbacks.length; i++) { callbacks[i].Callback.apply(callbacks[i].Subscriber, [arg, context]); } }







. .



Upd. . .




 ICallback. 
      



Trigger




:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { // }







, :



export class MessagesRepo { public MessagesLoaded = new Events.Event<string[]>(); public ErrorHappened = new Events.Event<ErrorHappenedOptions>(); }







:



public Subscribe() { // this.Subscriptions.push(MessagesRepoInstance.MessagesLoaded.Subscribe(function (messages: string[], context?: any) { alert(messages && messages.length > 0 ? messages[0] : 'Nothing'); }, this)); // this.Subscriptions.push(MessagesRepoInstance.ErrorHappened.Subscribe(function (error: ErrorHappenedOptions) { alert(error.Error); }, this)); }







// context subscriber.MessagesRepo.MessagesLoaded.Trigger(['Test message 1'], this); // subscriber.MessagesRepo.ErrorHappened.Trigger({ Error: 'Test error 1' });







Unsubscribe



:



public Unsubscribe(callback: ICallback<ArgType>): void { var filteredList: ICallbackDesc<ArgType>[] = []; for (var i = 0; i < this.Callbacks.length; i++) { if (this.Callbacks[i].Callback !== callback) { filteredList.push(this.Callbacks[i]); } } this.Callbacks = filteredList; }







!==



. . () - , . , , Unsubscribe



. .. .., , , . .



? . , JS , , TS, . - .



.. :



public static Main(): void { var subscriber1: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); var subscriber2: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); subscriber1.Subscribe(); subscriber2.Subscribe(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 1'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 1' }); subscriber1.Destroy(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 2'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 2' }); }







2 'Test message 1' 'Test error 1', 'Test message 2' 'Test error 2'.







apply:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { var callbacks: ICallbackDesc<ArgType>[] = this.Callbacks; for (var i = 0; i < callbacks.length; i++) { callbacks[i].Callback.apply(callbacks[i].Subscriber, [arg, context]); } }







. .



Upd. . .




ICallback.



Trigger




:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { // }







, :



export class MessagesRepo { public MessagesLoaded = new Events.Event<string[]>(); public ErrorHappened = new Events.Event<ErrorHappenedOptions>(); }







:



public Subscribe() { // this.Subscriptions.push(MessagesRepoInstance.MessagesLoaded.Subscribe(function (messages: string[], context?: any) { alert(messages && messages.length > 0 ? messages[0] : 'Nothing'); }, this)); // this.Subscriptions.push(MessagesRepoInstance.ErrorHappened.Subscribe(function (error: ErrorHappenedOptions) { alert(error.Error); }, this)); }







// context subscriber.MessagesRepo.MessagesLoaded.Trigger(['Test message 1'], this); // subscriber.MessagesRepo.ErrorHappened.Trigger({ Error: 'Test error 1' });







Unsubscribe



:



public Unsubscribe(callback: ICallback<ArgType>): void { var filteredList: ICallbackDesc<ArgType>[] = []; for (var i = 0; i < this.Callbacks.length; i++) { if (this.Callbacks[i].Callback !== callback) { filteredList.push(this.Callbacks[i]); } } this.Callbacks = filteredList; }







!==



. . () - , . , , Unsubscribe



. .. .., , , . .



? . , JS , , TS, . - .



.. :



public static Main(): void { var subscriber1: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); var subscriber2: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); subscriber1.Subscribe(); subscriber2.Subscribe(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 1'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 1' }); subscriber1.Destroy(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 2'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 2' }); }







2 'Test message 1' 'Test error 1', 'Test message 2' 'Test error 2'.







apply:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { var callbacks: ICallbackDesc<ArgType>[] = this.Callbacks; for (var i = 0; i < callbacks.length; i++) { callbacks[i].Callback.apply(callbacks[i].Subscriber, [arg, context]); } }







. .



Upd. . .




ICallback.



Trigger




:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { // }







, :



export class MessagesRepo { public MessagesLoaded = new Events.Event<string[]>(); public ErrorHappened = new Events.Event<ErrorHappenedOptions>(); }







:



public Subscribe() { // this.Subscriptions.push(MessagesRepoInstance.MessagesLoaded.Subscribe(function (messages: string[], context?: any) { alert(messages && messages.length > 0 ? messages[0] : 'Nothing'); }, this)); // this.Subscriptions.push(MessagesRepoInstance.ErrorHappened.Subscribe(function (error: ErrorHappenedOptions) { alert(error.Error); }, this)); }







// context subscriber.MessagesRepo.MessagesLoaded.Trigger(['Test message 1'], this); // subscriber.MessagesRepo.ErrorHappened.Trigger({ Error: 'Test error 1' });







Unsubscribe



:



public Unsubscribe(callback: ICallback<ArgType>): void { var filteredList: ICallbackDesc<ArgType>[] = []; for (var i = 0; i < this.Callbacks.length; i++) { if (this.Callbacks[i].Callback !== callback) { filteredList.push(this.Callbacks[i]); } } this.Callbacks = filteredList; }







!==



. . () - , . , , Unsubscribe



. .. .., , , . .



? . , JS , , TS, . - .



.. :



public static Main(): void { var subscriber1: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); var subscriber2: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); subscriber1.Subscribe(); subscriber2.Subscribe(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 1'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 1' }); subscriber1.Destroy(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 2'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 2' }); }







2 'Test message 1' 'Test error 1', 'Test message 2' 'Test error 2'.







apply:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { var callbacks: ICallbackDesc<ArgType>[] = this.Callbacks; for (var i = 0; i < callbacks.length; i++) { callbacks[i].Callback.apply(callbacks[i].Subscriber, [arg, context]); } }







. .



Upd. . .




ICallback.



Trigger




:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { // }







, :



export class MessagesRepo { public MessagesLoaded = new Events.Event<string[]>(); public ErrorHappened = new Events.Event<ErrorHappenedOptions>(); }







:



public Subscribe() { // this.Subscriptions.push(MessagesRepoInstance.MessagesLoaded.Subscribe(function (messages: string[], context?: any) { alert(messages && messages.length > 0 ? messages[0] : 'Nothing'); }, this)); // this.Subscriptions.push(MessagesRepoInstance.ErrorHappened.Subscribe(function (error: ErrorHappenedOptions) { alert(error.Error); }, this)); }







// context subscriber.MessagesRepo.MessagesLoaded.Trigger(['Test message 1'], this); // subscriber.MessagesRepo.ErrorHappened.Trigger({ Error: 'Test error 1' });







Unsubscribe



:



public Unsubscribe(callback: ICallback<ArgType>): void { var filteredList: ICallbackDesc<ArgType>[] = []; for (var i = 0; i < this.Callbacks.length; i++) { if (this.Callbacks[i].Callback !== callback) { filteredList.push(this.Callbacks[i]); } } this.Callbacks = filteredList; }







!==



. . () - , . , , Unsubscribe



. .. .., , , . .



? . , JS , , TS, . - .



.. :



public static Main(): void { var subscriber1: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); var subscriber2: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); subscriber1.Subscribe(); subscriber2.Subscribe(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 1'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 1' }); subscriber1.Destroy(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 2'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 2' }); }







2 'Test message 1' 'Test error 1', 'Test message 2' 'Test error 2'.







apply:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { var callbacks: ICallbackDesc<ArgType>[] = this.Callbacks; for (var i = 0; i < callbacks.length; i++) { callbacks[i].Callback.apply(callbacks[i].Subscriber, [arg, context]); } }







. .



Upd. . .




 ICallback. 
      



Trigger




:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { // }







, :



export class MessagesRepo { public MessagesLoaded = new Events.Event<string[]>(); public ErrorHappened = new Events.Event<ErrorHappenedOptions>(); }







:



public Subscribe() { // this.Subscriptions.push(MessagesRepoInstance.MessagesLoaded.Subscribe(function (messages: string[], context?: any) { alert(messages && messages.length > 0 ? messages[0] : 'Nothing'); }, this)); // this.Subscriptions.push(MessagesRepoInstance.ErrorHappened.Subscribe(function (error: ErrorHappenedOptions) { alert(error.Error); }, this)); }







// context subscriber.MessagesRepo.MessagesLoaded.Trigger(['Test message 1'], this); // subscriber.MessagesRepo.ErrorHappened.Trigger({ Error: 'Test error 1' });







Unsubscribe



:



public Unsubscribe(callback: ICallback<ArgType>): void { var filteredList: ICallbackDesc<ArgType>[] = []; for (var i = 0; i < this.Callbacks.length; i++) { if (this.Callbacks[i].Callback !== callback) { filteredList.push(this.Callbacks[i]); } } this.Callbacks = filteredList; }







!==



. . () - , . , , Unsubscribe



. .. .., , , . .



? . , JS , , TS, . - .



.. :



public static Main(): void { var subscriber1: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); var subscriber2: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); subscriber1.Subscribe(); subscriber2.Subscribe(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 1'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 1' }); subscriber1.Destroy(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 2'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 2' }); }







2 'Test message 1' 'Test error 1', 'Test message 2' 'Test error 2'.







apply:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { var callbacks: ICallbackDesc<ArgType>[] = this.Callbacks; for (var i = 0; i < callbacks.length; i++) { callbacks[i].Callback.apply(callbacks[i].Subscriber, [arg, context]); } }







. .



Upd. . .




ICallback.



Trigger




:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { // }







, :



export class MessagesRepo { public MessagesLoaded = new Events.Event<string[]>(); public ErrorHappened = new Events.Event<ErrorHappenedOptions>(); }







:



public Subscribe() { // this.Subscriptions.push(MessagesRepoInstance.MessagesLoaded.Subscribe(function (messages: string[], context?: any) { alert(messages && messages.length > 0 ? messages[0] : 'Nothing'); }, this)); // this.Subscriptions.push(MessagesRepoInstance.ErrorHappened.Subscribe(function (error: ErrorHappenedOptions) { alert(error.Error); }, this)); }







// context subscriber.MessagesRepo.MessagesLoaded.Trigger(['Test message 1'], this); // subscriber.MessagesRepo.ErrorHappened.Trigger({ Error: 'Test error 1' });







Unsubscribe



:



public Unsubscribe(callback: ICallback<ArgType>): void { var filteredList: ICallbackDesc<ArgType>[] = []; for (var i = 0; i < this.Callbacks.length; i++) { if (this.Callbacks[i].Callback !== callback) { filteredList.push(this.Callbacks[i]); } } this.Callbacks = filteredList; }







!==



. . () - , . , , Unsubscribe



. .. .., , , . .



? . , JS , , TS, . - .



.. :



public static Main(): void { var subscriber1: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); var subscriber2: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); subscriber1.Subscribe(); subscriber2.Subscribe(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 1'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 1' }); subscriber1.Destroy(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 2'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 2' }); }







2 'Test message 1' 'Test error 1', 'Test message 2' 'Test error 2'.







apply:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { var callbacks: ICallbackDesc<ArgType>[] = this.Callbacks; for (var i = 0; i < callbacks.length; i++) { callbacks[i].Callback.apply(callbacks[i].Subscriber, [arg, context]); } }







. .



Upd. . .




 ICallback. 
      



Trigger




:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { // }







, :



export class MessagesRepo { public MessagesLoaded = new Events.Event<string[]>(); public ErrorHappened = new Events.Event<ErrorHappenedOptions>(); }







:



public Subscribe() { // this.Subscriptions.push(MessagesRepoInstance.MessagesLoaded.Subscribe(function (messages: string[], context?: any) { alert(messages && messages.length > 0 ? messages[0] : 'Nothing'); }, this)); // this.Subscriptions.push(MessagesRepoInstance.ErrorHappened.Subscribe(function (error: ErrorHappenedOptions) { alert(error.Error); }, this)); }







// context subscriber.MessagesRepo.MessagesLoaded.Trigger(['Test message 1'], this); // subscriber.MessagesRepo.ErrorHappened.Trigger({ Error: 'Test error 1' });







Unsubscribe



:



public Unsubscribe(callback: ICallback<ArgType>): void { var filteredList: ICallbackDesc<ArgType>[] = []; for (var i = 0; i < this.Callbacks.length; i++) { if (this.Callbacks[i].Callback !== callback) { filteredList.push(this.Callbacks[i]); } } this.Callbacks = filteredList; }







!==



. . () - , . , , Unsubscribe



. .. .., , , . .



? . , JS , , TS, . - .



.. :



public static Main(): void { var subscriber1: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); var subscriber2: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); subscriber1.Subscribe(); subscriber2.Subscribe(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 1'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 1' }); subscriber1.Destroy(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 2'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 2' }); }







2 'Test message 1' 'Test error 1', 'Test message 2' 'Test error 2'.







apply:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { var callbacks: ICallbackDesc<ArgType>[] = this.Callbacks; for (var i = 0; i < callbacks.length; i++) { callbacks[i].Callback.apply(callbacks[i].Subscriber, [arg, context]); } }







. .



Upd. . .




ICallback.



Trigger




:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { // }







, :



export class MessagesRepo { public MessagesLoaded = new Events.Event<string[]>(); public ErrorHappened = new Events.Event<ErrorHappenedOptions>(); }







:



public Subscribe() { // this.Subscriptions.push(MessagesRepoInstance.MessagesLoaded.Subscribe(function (messages: string[], context?: any) { alert(messages && messages.length > 0 ? messages[0] : 'Nothing'); }, this)); // this.Subscriptions.push(MessagesRepoInstance.ErrorHappened.Subscribe(function (error: ErrorHappenedOptions) { alert(error.Error); }, this)); }







// context subscriber.MessagesRepo.MessagesLoaded.Trigger(['Test message 1'], this); // subscriber.MessagesRepo.ErrorHappened.Trigger({ Error: 'Test error 1' });







Unsubscribe



:



public Unsubscribe(callback: ICallback<ArgType>): void { var filteredList: ICallbackDesc<ArgType>[] = []; for (var i = 0; i < this.Callbacks.length; i++) { if (this.Callbacks[i].Callback !== callback) { filteredList.push(this.Callbacks[i]); } } this.Callbacks = filteredList; }







!==



. . () - , . , , Unsubscribe



. .. .., , , . .



? . , JS , , TS, . - .



.. :



public static Main(): void { var subscriber1: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); var subscriber2: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); subscriber1.Subscribe(); subscriber2.Subscribe(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 1'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 1' }); subscriber1.Destroy(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 2'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 2' }); }







2 'Test message 1' 'Test error 1', 'Test message 2' 'Test error 2'.







apply:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { var callbacks: ICallbackDesc<ArgType>[] = this.Callbacks; for (var i = 0; i < callbacks.length; i++) { callbacks[i].Callback.apply(callbacks[i].Subscriber, [arg, context]); } }







. .



Upd. . .




ICallback.



Trigger




:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { // }







, :



export class MessagesRepo { public MessagesLoaded = new Events.Event<string[]>(); public ErrorHappened = new Events.Event<ErrorHappenedOptions>(); }







:



public Subscribe() { // this.Subscriptions.push(MessagesRepoInstance.MessagesLoaded.Subscribe(function (messages: string[], context?: any) { alert(messages && messages.length > 0 ? messages[0] : 'Nothing'); }, this)); // this.Subscriptions.push(MessagesRepoInstance.ErrorHappened.Subscribe(function (error: ErrorHappenedOptions) { alert(error.Error); }, this)); }







// context subscriber.MessagesRepo.MessagesLoaded.Trigger(['Test message 1'], this); // subscriber.MessagesRepo.ErrorHappened.Trigger({ Error: 'Test error 1' });







Unsubscribe



:



public Unsubscribe(callback: ICallback<ArgType>): void { var filteredList: ICallbackDesc<ArgType>[] = []; for (var i = 0; i < this.Callbacks.length; i++) { if (this.Callbacks[i].Callback !== callback) { filteredList.push(this.Callbacks[i]); } } this.Callbacks = filteredList; }







!==



. . () - , . , , Unsubscribe



. .. .., , , . .



? . , JS , , TS, . - .



.. :



public static Main(): void { var subscriber1: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); var subscriber2: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); subscriber1.Subscribe(); subscriber2.Subscribe(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 1'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 1' }); subscriber1.Destroy(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 2'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 2' }); }







2 'Test message 1' 'Test error 1', 'Test message 2' 'Test error 2'.







apply:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { var callbacks: ICallbackDesc<ArgType>[] = this.Callbacks; for (var i = 0; i < callbacks.length; i++) { callbacks[i].Callback.apply(callbacks[i].Subscriber, [arg, context]); } }







. .



Upd. . .




ICallback.



Trigger




:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { // }







, :



export class MessagesRepo { public MessagesLoaded = new Events.Event<string[]>(); public ErrorHappened = new Events.Event<ErrorHappenedOptions>(); }







:



public Subscribe() { // this.Subscriptions.push(MessagesRepoInstance.MessagesLoaded.Subscribe(function (messages: string[], context?: any) { alert(messages && messages.length > 0 ? messages[0] : 'Nothing'); }, this)); // this.Subscriptions.push(MessagesRepoInstance.ErrorHappened.Subscribe(function (error: ErrorHappenedOptions) { alert(error.Error); }, this)); }







// context subscriber.MessagesRepo.MessagesLoaded.Trigger(['Test message 1'], this); // subscriber.MessagesRepo.ErrorHappened.Trigger({ Error: 'Test error 1' });







Unsubscribe



:



public Unsubscribe(callback: ICallback<ArgType>): void { var filteredList: ICallbackDesc<ArgType>[] = []; for (var i = 0; i < this.Callbacks.length; i++) { if (this.Callbacks[i].Callback !== callback) { filteredList.push(this.Callbacks[i]); } } this.Callbacks = filteredList; }







!==



. . () - , . , , Unsubscribe



. .. .., , , . .



? . , JS , , TS, . - .



.. :



public static Main(): void { var subscriber1: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); var subscriber2: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); subscriber1.Subscribe(); subscriber2.Subscribe(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 1'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 1' }); subscriber1.Destroy(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 2'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 2' }); }







2 'Test message 1' 'Test error 1', 'Test message 2' 'Test error 2'.







apply:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { var callbacks: ICallbackDesc<ArgType>[] = this.Callbacks; for (var i = 0; i < callbacks.length; i++) { callbacks[i].Callback.apply(callbacks[i].Subscriber, [arg, context]); } }







. .



Upd. . .




 ICallback. 
      



Trigger




:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { // }







, :



export class MessagesRepo { public MessagesLoaded = new Events.Event<string[]>(); public ErrorHappened = new Events.Event<ErrorHappenedOptions>(); }







:



public Subscribe() { // this.Subscriptions.push(MessagesRepoInstance.MessagesLoaded.Subscribe(function (messages: string[], context?: any) { alert(messages && messages.length > 0 ? messages[0] : 'Nothing'); }, this)); // this.Subscriptions.push(MessagesRepoInstance.ErrorHappened.Subscribe(function (error: ErrorHappenedOptions) { alert(error.Error); }, this)); }







// context subscriber.MessagesRepo.MessagesLoaded.Trigger(['Test message 1'], this); // subscriber.MessagesRepo.ErrorHappened.Trigger({ Error: 'Test error 1' });







Unsubscribe



:



public Unsubscribe(callback: ICallback<ArgType>): void { var filteredList: ICallbackDesc<ArgType>[] = []; for (var i = 0; i < this.Callbacks.length; i++) { if (this.Callbacks[i].Callback !== callback) { filteredList.push(this.Callbacks[i]); } } this.Callbacks = filteredList; }







!==



. . () - , . , , Unsubscribe



. .. .., , , . .



? . , JS , , TS, . - .



.. :



public static Main(): void { var subscriber1: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); var subscriber2: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); subscriber1.Subscribe(); subscriber2.Subscribe(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 1'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 1' }); subscriber1.Destroy(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 2'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 2' }); }







2 'Test message 1' 'Test error 1', 'Test message 2' 'Test error 2'.







apply:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { var callbacks: ICallbackDesc<ArgType>[] = this.Callbacks; for (var i = 0; i < callbacks.length; i++) { callbacks[i].Callback.apply(callbacks[i].Subscriber, [arg, context]); } }







. .



Upd. . .




ICallback.



Trigger




:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { // }







, :



export class MessagesRepo { public MessagesLoaded = new Events.Event<string[]>(); public ErrorHappened = new Events.Event<ErrorHappenedOptions>(); }







:



public Subscribe() { // this.Subscriptions.push(MessagesRepoInstance.MessagesLoaded.Subscribe(function (messages: string[], context?: any) { alert(messages && messages.length > 0 ? messages[0] : 'Nothing'); }, this)); // this.Subscriptions.push(MessagesRepoInstance.ErrorHappened.Subscribe(function (error: ErrorHappenedOptions) { alert(error.Error); }, this)); }







// context subscriber.MessagesRepo.MessagesLoaded.Trigger(['Test message 1'], this); // subscriber.MessagesRepo.ErrorHappened.Trigger({ Error: 'Test error 1' });







Unsubscribe



:



public Unsubscribe(callback: ICallback<ArgType>): void { var filteredList: ICallbackDesc<ArgType>[] = []; for (var i = 0; i < this.Callbacks.length; i++) { if (this.Callbacks[i].Callback !== callback) { filteredList.push(this.Callbacks[i]); } } this.Callbacks = filteredList; }







!==



. . () - , . , , Unsubscribe



. .. .., , , . .



? . , JS , , TS, . - .



.. :



public static Main(): void { var subscriber1: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); var subscriber2: Messages.SomeEventSubscriber = new Messages.SomeEventSubscriber(); subscriber1.Subscribe(); subscriber2.Subscribe(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 1'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 1' }); subscriber1.Destroy(); Messages.MessagesRepoInstance.MessagesLoaded.Trigger(['Test message 2'], this); Messages.MessagesRepoInstance.ErrorHappened.Trigger({ Error: 'Test error 2' }); }







2 'Test message 1' 'Test error 1', 'Test message 2' 'Test error 2'.







apply:



public Trigger: ICallback<ArgType> = function (arg: ArgType, context?: any) { var callbacks: ICallbackDesc<ArgType>[] = this.Callbacks; for (var i = 0; i < callbacks.length; i++) { callbacks[i].Callback.apply(callbacks[i].Subscriber, [arg, context]); } }







. .



Upd. . .







All Articles