3

我有不同类型的动作检查,它们执行不同的功能,只是我做了 if 和 else 条件来检查动作类型并执行相关功能,如下面的代码片段

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);
    }

有没有更好的解决方案来处理这种情况,因为我有可能在未来有更多的操作,我必须一次又一次地更改代码,我觉得这是低效的。

onMessage函数之间用作porthole库的事件侦听器(Porthole 是一个用于安全跨域 iFrame 通信的小型库。)我曾经在我的 react 应用程序的 iframe 中进行通信

提前致谢

4

2 回答 2

5

javascript中的对象可以看作是一个关联数组,其中键是属性或函数的名称。

因此,您可以像这样拨打电话:

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

警告(如 Joe Clay 所述):使用此语法,对象的每个函数this都是可调用的,因此如果this包含您不想“公开”的函数,则可能导致“安全漏洞”。

于 2017-01-06T09:48:06.787 回答
0

在这种情况下,switch 语句是你的朋友:

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);
    }
}

messageEvent如果您的字符串始终与其中一种方法匹配,则 ADreNaLiNe-DJ 的答案也将起作用this- 不过,这对我来说有点 hacky,因为这基本上意味着如果您有this.definitelyNotAnEventHandler,您仍然可以通过 调用它onMessage。我更喜欢更明确的方法——不过,这只是个人喜好问题:)

于 2017-01-06T09:52:08.883 回答