用更好的东西替换开关箱



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

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

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

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/

您可以有一个具有属性的Object,其中它们的名称是函数,并为每个属性分配一个匿名函数…

var handlers = {
    'changeUsername' : function(content) {
         Minte.Client.username = content; 
    },
    ...
};
var thisCommand = handlers[command];
if (thisCommand) {
   thisCommand.call(this, content);
}

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

最新更新