2013-08-31 56 views
0

我已經參與了一個大型Web應用程序,其中有很多通過JSON調用Web服務的函數。例如:JavaScript中的代碼優化JSON調用

/*...*/ 
refreshClientBoxes: function(customerNr) { 
     var request = {}; 
     request.method = "getClientBoxes"; 
     request.params = {}; 
     request.params.customerNr = customerNr; 
     request.id = Math.floor(Math.random() * 101); 
     postObject(jsonURL, JSON.stringify(request), successClientBoxes); 
    }, 

/*...*/ 

其中「postObject」是一個接收URL,數據和回調的函數。

正如你可以看到我有建造這段代碼在每一個方法:

var request = {}; 
    request.method = "getClientBoxes"; 
    request.params = {}; 
    request.params.customerNr = customerNr; 
    request.id = Math.floor(Math.random() * 101); 

什麼的變化是方法的名稱,我們將調用的名稱和我們想要的參數值通過。

所以我想知道是否有一種方法,我們可以通過一種方法來避免這種努力,該方法接收我們將調用的方法的名稱和參數數組,並使用某種反射構造請求參數並返回該請求已過時。

對於WS我使用了php + zend 1.12,JS中的MVC框架是它的ember 0.95和jQuery。

編輯1:非常感謝您的回答。我想要的是這樣一種方式,可以給我傳遞給函數的參數的名稱或我傳遞的變量的名稱。事情是這樣的:

var contructRequest = function (methodName, paramList) { 
    var request = {}; 
    request.method = methodName; 
    request.params = {}; 
    for(var i = 0; i < paramlist; i++){ 
     /*some how get the paramName through reflection...so if i give a variable called customerNr this "for" add this new parameter to list of parameters like request.params.customerNr = customerNr whatever the variable name is or its value*/ 
    } 
    request.params[paramName] = paramValue; 
    request.id = Math.floor(Math.random() * 101); 
    return request; 
} 

回答

1

怎麼樣的方法這樣的:

var contructRequest = function (methodName, paramList, paramName, paramValue) { 
    var request = {}; 
    request.method = methodName; 
    request.params = paramList; 
    request.params[paramName] = paramValue; 
    request.id = Math.floor(Math.random() * 101); 
    return request; 
} 

這利用了以下事實object.property也可以被稱爲使用object["property"]

可以調用像這樣的方法:

var customerRequest = constructRequest("getClientBoxes", {}, "customerNr", customerNr); 
postObject(jsonURL, JSON.stringify(customerRequest), successClientBoxes); 
+0

當你坐在request.params [「paramName」]時,「paramName」與函數中的paramName是一樣的嗎?您知道如何在JS或jQuery中獲取變量的名稱......這可以解決我的問題...謝謝 –

+1

您的意思是'request.params [paramName]',而不是'request.params [「paramName」]'。 –

+0

@MattBall,哎呀,我寫這個很匆忙!我現在編輯了我的答案。 –

0

您可以通過在一個單獨的函數,它接受非公共部分作爲參數,並返回JSON封裝常見份幹這個。例如,如果我們假設跨越不同的功能改變只有部分是methodcustomerNr

buildRequest(method, customerNr) { 
    var request = { 
     method: method, 
     params: { 
      customerNr: customerNr 
     }, 
     id: Math.floor(Math.random() * 101) 
    }; 
    return JSON.stringify(request); 
} 

,你會使用它像這樣:

refreshClientBoxes: function(customerNr) { 
    var json = buildRequest('getClientBoxes', customerNr); 
    postObject(jsonURL, json, successClientBoxes); 
}, 
+0

但是這是同樣的問題,因爲我有一個具有其他參數,如customerAccount或phoneNr等其他功能 我想這是一個方式,可能與反思,這可以像上面的例子一樣構建請求。 –

+0

爲什麼?我不明白爲什麼這是一個「問題」。如果您編輯問題以添加另外一個或兩個示例,可能會有所幫助,從而準確解釋您要解決的問題。 –