DRYing JavaScript函数采取可选参数和callback
在Node.js中,由于几个原因,习惯/推荐将callback函数作为最后一个parameter passing给函数。 可能还有一个或多个可选参数,我们希望在callback之前通过。 你最终会看到很多非常重复的代码,比如
// receiveMessages([options], [callback]) function receiveMessages(options, callback) { if(typeof options === 'function'){ callback = options; options = {}; // or some other sensible default } //... }
添加额外的可选参数意味着添加额外的检查,当然:
// through([dest], [options], [callback]) function through(dest, options, callback) { if(typeof dest === 'function'){ callback = dest; dest = noop(); options = {}; }else if(typeof options === 'function'){ callback = options; options = {}; } // ... }
编辑这个模式也出现 在整个标准库中。
我可以想到一些干这种干的方法,但我想知道是否有人有一个特别优雅或通用的解决scheme,以获得参数绑定到正确的位置参数。
有一件事是我想到的方法重载。 从技术上讲,这不是在JavaScript支持,但有一些方法来实现这样的事情。 John Resig在他的博客中有一篇关于它的文章: http : //ejohn.org/blog/javascript-method-overloading/
另外,这里是我的实现,这与John Resig非常相似,并且受到它的高度鼓舞:
var createFunction = (function(){ var store = {}; return function(that, name, func) { var scope, funcs, match; scope = store[that] || (store[that] = {}); funcs = scope[name] || (scope[name] = {}); funcs[func.length] = func; that[name] = function(){ match = funcs[arguments.length]; if (match !== undefined) { return match.apply(that, arguments); } else { throw "no function with " + arguments.length + " arguments defined"; } }; }; }());
这使您可以每次使用不同数量的参数多次定义相同的函数:
createFunction(window, "doSomething", function (arg1, arg2, callback) { console.log(arg1 + " / " + arg2 + " / " + callback); }); createFunction(window, "doSomething", function (arg1, callback) { doSomething(arg1, null, callback); });
这段代码定义了一个全局函数doSomething
,一次有三次,一次有两个参数。 正如你所看到的,这种方法的第一个缺点是你必须提供一个函数所附加的对象,你不能只是说“在这里定义一个函数”。 另外,函数声明比以前复杂一点。 但是你现在可以用不同数量的参数调用你的函数,并得到正确的结果,而不使用重复的if..else
结构:
doSomething("he", function(){}); //he / null / function(){} doSomething("he", "ho", function(){}); //he / ho / function(){}
到目前为止,只有争论的数量很重要,但我可以想到扩展这个,也可以对不同的数据types作出反应,以便还可以区分以下内容:
function doSomething(opt1, opt2, callback){ //some code } doSomething({anObject: "as opt1"}, function(){}); doSomething("a string as opt2", function(){});
尽pipe如此,这可能不是最好的方式,但在某些情况下可以很方便。 对于很多可选参数,我个人喜欢Pumbaa80将这些选项放在一个必需的对象参数中的答案。
在Node.js中,由于几个原因,习惯/推荐将callback传递给函数作为最后一个参数
我能想到的唯一原因是迫使开发者提供其他论点。
例如, function (success, error)
会导致编程不顺畅,因为懒惰的编码器会简单地省略error
callback。 这就是为什么你经常看到function (error, success)
。
这就是说,上述公约对于强制性的论据是很好的。 如果你想要可选参数,就不要这样做。 处理这种情况的一种方法是以下scheme:
function (required1, required2, ..., callback, options) // or function (required1, required2, ..., options, callback)
其中每个可选参数可以或不可以作为options
的属性options
。
编辑 :实际上,这是用在一些节点库,例如http://nodejs.org/api/fs.html#fs_fs_appendfile_filename_data_options_callback
- Meteor.js错误:从exceptionxGHk6PkFTQ9uv8ncg TypeError:不能调用未定义的方法“查找”
- 是否有可能在哈斯克尔和前端用JavaScript写后端?
- NodeJS,自定义Content-Type给出空的主体
- mongoose:validation错误path是必需的
- 如何通过在量angular器中使用promise来查询mysql数据库
- 我怎样才能重复使用摩卡testing,所以我不必重复自己?
- 会话未定义 – 使用Connect-Redis / ExpressJS / Node
- Node.js客户端会话不创buildreq.session
- Angular 2 / webpack“未捕获的ReferenceError:require没有定义”