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

标签 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
    });

最佳答案

不要设计这种类型的函数签名。这是一场难以处理的噩梦,而且最终也会让您的用户感到困惑。您还会遇到奇怪的情况,其中 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();

关于javascript - javascript 中的可选参数或重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41484939/

相关文章:

javascript - 带有 *ngIf 的 Angular 2 条件循环

javascript - React.js 不区分同一类的两个组件

javascript - Jquery 插件 : Object not accessible from same instance

javascript音频在 react 中当前播放时暂停先前播放的音频

javascript - 在删除按钮上 Bootstrap 多个数据切换?

javascript - 什么是 new function(settings){...}(jQuery.query || {});在javascript中是什么意思?

javascript - jQuery循环+遍历获取页面上对象的数组编号/位置

javascript - 在我开发时,chrome devtools 可以使用本地文件而不是网络文件吗?

javascript - 如何使用 jquery 获取所选 Asp.net checkBoxList 项目的索引及其文本值

javascript - 如何使用 Mocha/Chai 检查文件名是否包含字符串?