用更好的东西取代Switch-Case?

时间:2011-07-11 00:53:35

标签: javascript

我正在开发一个Web聊天应用程序。您在上面看到的代码用于处理以JSON格式接收的响应中的数据。基本上它是如何工作的是将Ajax长轮询请求发送到服务器,该请求将需要发送给用户的消息拉出。以JSON格式输出,由JS解析,然后调用Minte.Processor.process(json)来处理其余的输出。

我想用其他东西替换switch语句。正如你所看到的,有很多命令(我估计至少还有50个),所以我需要一个更优雅的解决方案。我正在考虑创建一个包含键值对数组的对象,其中键是命令名称,值是数据,但我不知道这是否比switch更低效。

2 个答案:

答案 0 :(得分:3)

您可以创建一个知道如何处理每个命令的处理程序对象,并为每个命令提供一个方法。大致像:

var myHandler = {
    addChatNotice: function(content) {
        Minte.UI.addChatNotice(content);
    }, 

    changeUsername: function(content) {
        Minte.Client.username = content;
    }

    //etc...
};

Minte.Processor.process = function(json) {
    for (var x in json) {
        var entry = json[x]; 

        for (var command in entry) {
            var content = entry[command];

            //invoke the handler function with the content
            myHandler[command](content);
        }
    }
};

以下是一个简单示例:http://jsfiddle.net/XLrN5/

答案 1 :(得分:2)

你可以拥有一个Object属性,其名称是函数,并为每个属性分配一个匿名函数...

var handlers = {
    'changeUsername' : function(content) {
         Minte.Client.username = content; 
    },
    ...
};

var thisCommand = handlers[command];

if (thisCommand) {
   thisCommand.call(this, content);
}

每个匿名函数的第一个参数将是content变量。