javascript中的可选参数或重新排序

时间:2017-01-05 12:18:07

标签: javascript

有没有简单的方法来处理基于实体的参数?

在我的函数上,所有取决于第二个参数或第三个是函数,对象等。这是我的功能:

function fbAPI(endpoint, param1, param2, param3, param4) {

    var type, params, success, error;

    if(typeof param1 !== 'function' && typeof param2 !== 'function')
    {
        type    = param1;
        params  = param2;
        success = param3;
        error   = param4;
    }

    if(typeof param1 === 'function')
    {
        type    = 'GET';
        params  = {};
        success = param1;
        error   = param2;
    }

    if(typeof param1 === 'object')
    {
        type    = 'GET';
        params  = param1;
        success = param2;
        error   = param3;
    }

    if(typeof param1 !== 'function' && typeof param2 === 'function')
    {
        type    = param1;
        params  = {};
        success = param2;
        error   = param3;
    }

    FB.api(
        endpoint,
        type,
        params,
        function (response) {

            if (response && !response.error) {
                /* handle the result */
                if(typeof success === 'function')
                    success(response);
            }

            if (response && response.error) {
                console.log(response.error);
                /* handle the result */
                if(typeof error === 'function')
                    error(response);
            }
        }
    );
}

有没有办法缩短它?

我应该这样调用我的函数:

    this.api(_self.endPoints.friends, function (response) {
       //do something
    });

    this.api(_self.endPoints.friends, function (response) {
       //do something
    },function (response) {
       //do something
    });

    this.api(_self.endPoints.friends, 'GET', function (response) {
       //do something
    },function (response) {
       //do something
    });

    this.api(_self.endPoints.friends, {data: data}, function (response) {
       //do something
    },function (response) {
       //do something
    });

    this.api(_self.endPoints.friends, 'GET', {data: data}, function (response) {
       //do something
    },function (response) {
       //do something
    });

5 个答案:

答案 0 :(得分:2)

也许尝试这样的事情并决定在调用你的函数时该怎么做

function example(opts) {
    // Do whatever you want with the options here
}


example({"type":"GET", "param":"[\"something\",\"here\",\"too\"]", "success":"yay", "error":"boo"});

答案 1 :(得分:2)

不要设计这种类型的功能签名。这是一个噩梦,它也会让你的用户感到困惑。您最终会遇到fbAPI(endpoint, 'GET', success, error)失败的奇怪情况,因为在给出类型的情况下您没有考虑默认params

如果你坚持,那么如果你把这些论点看作一个数组,你就会把事情从前面移开,这会更容易:

function fbAPI(endpoint, ...args) {

    var 
      type    = typeof args[0] === 'string' ? args.shift() : 'GET', 
      params  = typeof args[0] === 'object' ? args.shift() : {},
      success = args.shift(),
      error   = args.shift();

答案 2 :(得分:1)

你这样做的方式有点奇怪,但你可以使用一个数组。示例:

var t = {
    // typeof param1
    'function': {
        // typeof param2
        'function': ['GET', param1, param2],
        'object': ['GET', param3, param2],
    },
    'object': {
        'function':['GET', param1, param3],
        'object': 'error',
    }
};


var r = t[typeof param1][typeof param2];

希望它有所帮助。

答案 3 :(得分:1)

因为您正在使用JavaScript,所以我会避免使用多种方法来调用内部方法。这称为方法重载,这是JavaScript固有的,与Java或C#等其他语言不同。

有几种方法可以做你正在寻找的东西,虽然你拥有它的方式只是冗长。我 做的一件事就是让它们if / else if / else语句而不是所有if语句,以便立即识别它你不能进入倍数。我也会重新排序,以便它们在逻辑上流过一点。

var type, params, success, error;

if(typeof param1 === 'function') {
    type    = 'GET';
    params  = {};
    success = param1;
    error   = param2;
} else if(typeof param1 === 'object') {
    type    = 'GET';
    params  = param1;
    success = param2;
    error   = param3;
} else if(typeof param1 !== 'function' && typeof param2 === 'function') {
    type    = param1;
    params  = {};
    success = param2;
    error   = param3;
} else  if(typeof param1 !== 'function' && typeof param2 !== 'function') {
    type    = param1;
    params  = param2;
    success = param3;
    error   = param4;
}

但是,您也可以使用arguments数组来简化操作。您还可以检查数组的长度,以确保您至少拥有您正在寻找的所有参数。

function fbAPI(endpoint) {
    var type, params, success, error;

    if(typeof arguments[0] === 'function' && arguments.length === 2) {
        type    = 'GET';
        params  = {};
        success = arguments[0];
        error   = arguments[1];
    } else if(typeof param1 === 'object' && arguments.length === 3) {
        type    = 'GET';
        params  = arguments[0];
        success = arguments[1];
        error   = arguments[2];
    } else if(typeof param1 !== 'function' && typeof param2 === 'function' && arguments.length === 3) {
        type    = arguments[0];
        params  = {};
        success = arguments[1];
        error   = arguments[2];
    } else  if(typeof param1 !== 'function' && typeof param2 !== 'function' && arguments.length === 4) {
        type    = arguments[0];
        params  = arguments[1];
        success = arguments[2];
        error   = arguments[3];
    }
    // ... the rest of your function
}

最后,最好的方法是让你的参数成为一个对象,让呼叫者设置他们想要的东西。

function fbAPI(endpoint, settings) {
    var type = settings.type || 'GET';
    var params = settings.params || {};
    var success = settings.success;
    var error = settings.error;

    // Go about your business...
}

答案 4 :(得分:0)

有很多种方法可以找到以下三种方式:



// Destructuring Assignment
function test1Fun ({ name, val }) {
  console.log(name, val);
}

// Extended Parameter Handling
function test2Fun (...params) {
  console.log(params.length);
  console.log(params[0]);
  console.log(params[1]);
  console.log(params[2]);
}

// Key-value
function test3Fun (options) {
  console.log(options.name);
}

var options = { name: "bar", val: 42 };
test1Fun(options);
test2Fun(1, 2, 3, 4, 5);
test3Fun(options);