有没有简单的方法来处理基于实体的参数?
在我的函数上,所有取决于第二个参数或第三个是函数,对象等。这是我的功能:
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
});
答案 0 :(得分:2)
也许尝试这样的事情并决定在调用你的函数时该怎么做
function example(opts) {
// Do whatever you want with the options here
}
example({"type":"GET", "param":"[\"something\",\"here\",\"too\"]", "success":"yay", "error":"boo"});
答案 1 :(得分:2)
不要设计这种类型的功能签名。这是一个噩梦,它也会让你的用户感到困惑。您最终会遇到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();
答案 2 :(得分:1)
你这样做的方式有点奇怪,但你可以使用一个数组。示例:
var t = {
// typeof param1
'function': {
// typeof param2
'function': ['GET', param1, param2],
'object': ['GET', param3, param2],
},
'object': {
'function':['GET', param1, param3],
'object': 'error',
}
};
var r = t[typeof param1][typeof param2];
希望它有所帮助。
答案 3 :(得分:1)
因为您正在使用JavaScript,所以我会避免使用多种方法来调用内部方法。这称为方法重载,这是JavaScript固有的,与Java或C#等其他语言不同。
有几种方法可以做你正在寻找的东西,虽然你拥有它的方式只是冗长。我 做的一件事就是让它们if
/ else if
/ else
语句而不是所有if
语句,以便立即识别它你不能进入倍数。我也会重新排序,以便它们在逻辑上流过一点。
var type, params, success, error;
if(typeof param1 === 'function') {
type = 'GET';
params = {};
success = param1;
error = param2;
} else if(typeof param1 === 'object') {
type = 'GET';
params = param1;
success = param2;
error = param3;
} else if(typeof param1 !== 'function' && typeof param2 === 'function') {
type = param1;
params = {};
success = param2;
error = param3;
} else if(typeof param1 !== 'function' && typeof param2 !== 'function') {
type = param1;
params = param2;
success = param3;
error = param4;
}
但是,您也可以使用arguments
数组来简化操作。您还可以检查数组的长度,以确保您至少拥有您正在寻找的所有参数。
function fbAPI(endpoint) {
var type, params, success, error;
if(typeof arguments[0] === 'function' && arguments.length === 2) {
type = 'GET';
params = {};
success = arguments[0];
error = arguments[1];
} else if(typeof param1 === 'object' && arguments.length === 3) {
type = 'GET';
params = arguments[0];
success = arguments[1];
error = arguments[2];
} else if(typeof param1 !== 'function' && typeof param2 === 'function' && arguments.length === 3) {
type = arguments[0];
params = {};
success = arguments[1];
error = arguments[2];
} else if(typeof param1 !== 'function' && typeof param2 !== 'function' && arguments.length === 4) {
type = arguments[0];
params = arguments[1];
success = arguments[2];
error = arguments[3];
}
// ... the rest of your function
}
最后,最好的方法是让你的参数成为一个对象,让呼叫者设置他们想要的东西。
function fbAPI(endpoint, settings) {
var type = settings.type || 'GET';
var params = settings.params || {};
var success = settings.success;
var error = settings.error;
// Go about your business...
}
答案 4 :(得分:0)
有很多种方法可以找到以下三种方式:
// Destructuring Assignment
function test1Fun ({ name, val }) {
console.log(name, val);
}
// Extended Parameter Handling
function test2Fun (...params) {
console.log(params.length);
console.log(params[0]);
console.log(params[1]);
console.log(params[2]);
}
// Key-value
function test3Fun (options) {
console.log(options.name);
}
var options = { name: "bar", val: 42 };
test1Fun(options);
test2Fun(1, 2, 3, 4, 5);
test3Fun(options);