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

Handling optional arguments in javascript without wrapping them in an object

本文关键字:包装 对象 参数 javascript 处理      更新时间:2023-09-26

我有几个函数具有相同的签名:(user, callback)。我碰到一个API,当集合超过一定大小时返回分页结果-当这种情况发生时,我得到一个游标,我可以使用它来获取下一个集合,等等。

我的问题:我希望能够接受一个可选的'next'参数。显然,使用'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';
    ...
}

没有帮助,因为如果我扩展这个示例以适应我的用例,那么无论何时调用函数而不带可选参数时,我的回调仍然会落入第二个参数槽。

这样怎么样:

this.getSubmissions = function (/* user, next, callback */) {
  var user = arguments[0];
  var next = arguments[1];
  var callback = arguments[2];
  if (!callback) {
    callback = next;
    next = null;
  }
  var path = user + '/submissions/';
  if (next) {
    path += '?next=' + next;
  }
  get(path, callback);
};