在javascript中处理可选参数而不将其包装在对象中
Handling optional arguments in javascript without wrapping them in an object
我有几个函数具有相同的签名:(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);
};
相关文章:
- 为什么要包装每一个原型“;类“;JS中具有匿名函数的对象
- 在jquery$({})中包装纯javascript对象
- 在$.ajax调用中将附加数据添加到jQuery包装的对象数据中
- 面向对象的WebGL上下文包装失败
- 将对象内部的参数包装给函数是一个坏主意吗?
- 发送到谷歌应用脚本的谷歌电子表格对象包装器中是否存在错误
- jQuery 插件 datetimepicker 未被 Date() 对象包装器识别为日期的问题
- 检查对象是否在 css 边框/css 包装器内
- 在 Ember 对象中深度包装 JSON 响应对象
- 在对象内临时包装具有相同类型的数组项
- 如何在 angularjs 服务中包装对象(并观察此对象的更改)
- 如何以编程方式将 javascript 对象属性包装在函数中
- 如何使用原型创建基元包装器对象
- 如果 JS 包装器对象被认为是糟糕的风格,那么使用 lodash _.isString 等进行类型检查是否也被认为是糟糕
- 用try-catch包装现有javascript对象的所有方法
- 返回一个用JavaScript包装的对象
- 如何访问nodejs插件中的包装对象属性
- 如何获得父/包装对象的引用
- 如何在Promise中包装对象
- 如何设置JavaScript回调到外部(包装)对象的方法