如何在JavaScript函数

时间:2018-02-22 17:40:57

标签: javascript

如何在JavaScript中创建实用程序功能,如下所示, URL 是第一个参数,成功和错误回调将是最后一个参数(必填),任意数量的

之间的可选参数
function performAction(URL, optional1, optional2, successCallback, errorCallback){
      //api call with given url and other parameters with callback
}

并且应该像下面那样调用函数而不进行解构

performAction(url, op1, success, error);

2 个答案:

答案 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) {...}

这会支持您所需的功能,但会强制用户至少提供一个空的ArrayObject作为第二个参数:

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];

要访问任何剩余值,您需要:

  • 使用起始索引1迭代它们并在索引小于argLength - 2时运行它们,或
  • arguments对象转换为数组,并将值slice转换为自己的数组

注意:我不推荐这种方法,但从技术上讲,它是可行的。

相关问题