0

我参与了一个大型 Web 应用程序,其中有很多通过 JSON 调用 Web 服务的函数。例如:

/*...*/
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;
}
4

2 回答 2

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这利用了也可以称为 using的事实object["property"]

您可以像这样调用该方法:

var customerRequest = constructRequest("getClientBoxes", {}, "customerNr", customerNr);
postObject(jsonURL, JSON.stringify(customerRequest), successClientBoxes);
于 2013-08-31T18:21:42.673 回答
0

您可以通过将公共部分封装在一个单独的函数中来干燥它,该函数将非公共部分作为参数,并返回 JSON。例如,如果我们假设在不同函数中变化的唯一部分是methodand customerNr

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);
},
于 2013-08-31T18:20:05.953 回答