在javascript中处理可选参数而不将它们包装在对象中

时间:2016-10-18 16:12:40

标签: javascript node.js

我有几个具有相同签名的函数:(用户,回调)。我正在使用一个API,当集合超过一定大小时会返回分页结果 - 当发生这种情况时,我会返回一个可以用来获取下一个集合的游标,依此类推。

我的问题:我希望能够接受一个可选的“下一个”参数。显然,使用'null'作为占位符是不合适的,我想这样做而不需要将我的参数包装在一个对象中,例如({user:'person',next:'12345'},callback)。这似乎是常见的模式,但这个项目是供公众使用的,我认为这对于习惯使用类似库的人来说是一种意想不到的奇怪语法。

这是我目前的解决方案。我对它并不十分满意,我确信有更好的方法来实现这一目标。

var parseArguments = function (args){
    // callback will always be the last argument
    var callback = args[args.length - 1];
    var next = args.length > 2 ? args[1] : null;
    return {callback: callback, next: next};
};

以下是它的使用方法:

this.getSubmissions = function (user, next, callback){
    var args = parseArguments(arguments);
    var path = user + '/submissions/';
       if (args.next){
           path += '?next=' + args.next;
       }
    get(path, args.callback);
};

这使我可以执行以下操作:

client.getSubmissions('username', function (error, response, body){
    // stuff
})

或:

client.getSubmissions('username', 'cursor', function (error, response, body){
    // stuff
})

我问这个问题吗?是不是有一种不那么笨拙的方式呢?

编辑:哎呀,我应该澄清一下,我正在寻找ES5兼容的解决方案。此外,其他建议的答案提供了默认参数问题的解决方案,但没有考虑可选的问题出现在两个必需问题的中间的情况。例如:

function foo(a, b){
    a = typeof a !== 'undefined' ? a : 42;
    b = typeof b !== 'undefined' ? b : 'default_b';
    ...
}

没有用,因为如果我扩展这个例子以适应我的用例,那么只要在没有可选arg的情况下调用函数,我仍然会将我的回调放入第二个参数槽。

1 个答案:

答案 0 :(得分:0)

这样的事情:

ID_client
2
3