2017-01-06 7 views
2

私は異なる機能を行うアクションチェックの異なる種類を持って、単に私はアクションの種類を確認し、以下のコードスニペットtypescript-reactjsのif文を避けるには?

public onMessage = (messageEvent) => { 
    if (messageEvent.data.action === 'subscribeTriggers') { 
     this.subscribeTriggers(messageEvent); 
    } else if (messageEvent.data.action === 'setGlobalFilters') { 
     this.setGlobalFilters(messageEvent); 
    } else if (messageEvent.data.action === 'getGlobalFilters') { 
     this.receiveGlobalFilters(messageEvent); 
    } else if (messageEvent.data.action === 'initFromGlobalFilters') { 
     this.initFromGlobalFilters(messageEvent); 
    } 

のような関連する機能を実行するためにifとelse条件を作っ処理するためのよりよい解決策がありますこの種のシナリオは、私が来なければならない将来、コードを何度も何度も変更しなければならない、より多くの行動をとる可能性があるため、私はそれが非効率的だと感じました。このonMessage機能との

は私が事前

でのアプリのIFRAME

感謝を反応させ、私の中での通信に使用するportholeライブラリ(舷窓は、安全なクロスドメインのiFrameの通信のための小さなライブラリである。)のイベントリスナーとして使用されています

答えて

5

javascriptのオブジェクトは、キーがプロパティまたは関数の名前である連想配列として見ることができます。 (ジョー・クレイで述べたように)

this[messageEvent.data.action](messageEvent); 

WARNING:

だから、あなたはこのようなあなたの電話をかけることができ、この構文で、それは「セキュリティを引き起こす可能性がありますので、あなたのオブジェクトthisのすべての機能は、呼び出し可能ですthisに「公開」したくない機能が含まれている場合は、「違反」となります。

0

switch文は、このような状況ではあなたの友達です:あなたmessageEvent文字列は常にthis上のいずれかの方法で一致した場合

public onMessage = (messageEvent) => { 
    switch (messageEvent.data.action) { 
     case "subscribeTriggers": 
      return this.subscribeTriggers(messageEvent); 
     case "setGlobalFilters": 
      return this.setGlobalFilters(messageEvent); 
     case "getGlobalFilters": 
      return this.recieveGlobalFilters(messageEvent); 
     case "initFromGlobalFilters": 
      return this.initFromGlobalFilters(messageEvent); 
    } 
} 

アドレナリンDJの答えもうまくいく - しかし、私には少しハック感じ、あなたがthis.definitelyNotAnEventHandlerを持っていれば、基本的にはonMessageで呼び出すことができます。私はより明示的なアプローチを好みますが、これはちょっとした味の問題です:)

+0

あなたの「明示的な」アプローチはうまくいっていますが、この「必要性」を満たしません。 –

+0

@ ADreNaLiNe-DJ:コードを変更する必要性を完全に排除するわけではありませんが、繰り返しを減らすことができます。私はちょうど、任意の文字列で 'this'を索引付けするファンではなく、微妙なバグを引き起こす可能性があります。そのルートに行きたい場合は、 'this.eventHandlers'オブジェクトを作成し、this.eventHandlers [messageEvent.data.action](messageEvent)'を実行する方が良いでしょう。 –

+0

私はあなたに同意しますが、提出されたコードでは、コールバックと 'onMessage'以外の何かがあることを暗示しています。しかし、「安全保障」に関する「警告」は意味がある。 –

関連する問題