如何在JavaScript中创建实用程序功能,如下所示, URL 是第一个参数,成功和错误回调将是最后一个参数(必填),任意数量的
之间的可选参数function performAction(URL, optional1, optional2, successCallback, errorCallback){
//api call with given url and other parameters with callback
}
并且应该像下面那样调用函数而不进行解构
performAction(url, op1, success, error);
答案 0 :(得分:1)
使用rest参数如下:
function varArgs (URL, ...options) {
// Check that options has at least two values for the callbacks
if (options.length < 2)
throw (new Error ('varArgs : no callbacks specified'));
// Extract last two values in options and assign to callbacks
let cb_error = options.pop (),
cb_success = options.pop ();
// Verify that callbacks are indeed functions
if (typeof cb_error != 'function' || typeof cb_success != 'function')
throw (new Error ('varArgs : callbacks not functions!!'));
// now process URL using options and call appropriate callback.
// ....
}
答案 1 :(得分:0)
有两种方法可以完成您所描述的内容,但它们都不能100%满足您的要求。 。
1)使用必需的options
数组或对象来保存可选参数
在这种方法中,除了必要的参数之外,你还有一个“待命”参数来保存0个或多个参数:
function performAction(URL, options, successCallback, errorCallback) {...}
这会支持您所需的功能,但会强制用户至少提供一个空的Array
或Object
作为第二个参数:
performAction(someURL, [], function1, function2);
performAction(someURL, [foo, bar], function1, function2);
performAction(someURL, {}, function1, function2);
performAction(someURL, {foo: "abc", bar: "xyz"}, function1, function2);
2)使用ES6提供的较新“休息参数”
这种方法允许您使任何其他参数真正可选(不需要空值),但是,休息参数必须是函数中的最后一个参数:
function performAction(URL, successCallback, errorCallback, ...options) {...}
所以,虽然你不会得到想要的参数顺序,但它可以满足你想要让可选参数真正可选:
performAction(someURL, function1, function2);
performAction(someURL, function1, function2, foo);
performAction(someURL, function1, function2, foo, bar, baz);
任何其他参数将被拉在一起并存储在一个数组中,可以在函数中访问。有关详情,请参阅MDN上的rest parameters。
这种方法的另一个缺点是ES6仍在推广到浏览器中,因此目前尚不支持浏览器。您可以使用像Babel这样的转换器使这些浏览器可以理解,但这确实增加了这种方法的复杂性。
UPDATE:从技术上讲,还有第3个选项可以使用内置于JavaScript函数中的arguments
对象(MDN上的更多信息here),但是这个会很乱。您需要使用三个必需参数定义函数:
function performAction(URL, successCallback, errorCallback) {...}
。 。 。但是然后调用函数(可能)超过三个预期的参数:
performAction(someURL, function1, function2);
performAction(someURL, foo, function1, function2);
performAction(someURL, foo, bar, baz, function1, function2);
然后,该函数需要以复杂的方式访问参数。 。 。您实际上需要根据它们在arguments
对象中的位置重新定义最后两个参数值:
var argLength = arguments.length;
successCallback = arguments[argLength - 2];
errorCallback= arguments[argLength - 1];
要访问任何剩余值,您需要:
argLength - 2
时运行它们,或arguments
对象转换为数组,并将值slice
转换为自己的数组注意:我不推荐这种方法,但从技术上讲,它是可行的。