2011-07-11 43 views
1

我正在開發一個Web聊天應用程序。您在上面看到的代碼用於處理以JSON格式收到的響應中的數據。基本上,它的工作原理是將Ajax長輪詢請求發送到服務器,該服務器將需要發送給用戶的消息拉出。以JS格式解析JSON格式的輸出,然後調用Minte.Processor.process(json)來處理其餘部分。用更好的東西代替開關盒?

我想用別的東西替換switch語句。正如你所看到的,有很多命令(我估計還有至少50個命令),所以我需要一個更優雅的解決方案。我正在考慮創建一個對象,該對象包含一系列鍵 - 值對,其中鍵是命令名,值是數據,但我不知道這是否比開關效率低。

+0

這可能是值得指出的是,參數的函數被調用'json',但是,你立即開始遍歷該變量。這聽起來像只是一個JavaScript對象。如果它是JSON字符串,則首先需要將其解析爲JavaScript「Object」。 – alex

+2

你的鍵盤上坐着一隻貓嗎? – Jordan

回答

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/

2

你可以有特性,其中他們的名字是功能和分配給每個匿名函數的Object ...

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

var thisCommand = handlers[command]; 

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

的第一個參數每一個的匿名函數將是content變量。