我有几个具有相同签名的函数:(用户,回调)。我正在使用一个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的情况下调用函数,我仍然会将我的回调放入第二个参数槽。
答案 0 :(得分:0)
这样的事情:
ID_client
2
3