当最后一个参数是callback时,NodeJS默认参数

我有这样一个function(简化):

doSmthg (name, age, callback) { callback(name, age); } 

如果没有提供,我希望有一个年龄的默认值。

我知道我可以在ES6中做doSmthg(name, callback, age=42) {...} ,但是我被告知callback应该总是最后一个参数,因为它使得函数的调用更具可读性。

现在我发现的解决scheme是做到以下几点:

 doSmthg (name, age, callback) { if (arguments.length === 2) { age = 42; callback = age; } } 

但我觉得这个解决scheme很难阅读。

这是好的解决scheme吗? 有更好的吗?

对于这种情况,你可以使用这样的东西:

 function doSmthg(name, age, callback) { if (typeof age === 'function') { callback = age; age = DEFAULT_VALUE; } //continue } 

或者你可以使用哈希选项,我认为这样做更好,因为使得代码更具可读性,这取决于参数的数量:

 function doSmthg(options, callback) { var name = options.name; var age = options.age || DEFAULT_VALUE; //continue } doSmthg({ name: 'batman' }, function() {}); 

您也可以使用下划线#extend函数将选项与默认值合并。

如果您有权访问传播运营商:

 function foo(...args) { const callback = args.pop(); const [name, age = 42] = args; // ... } 

但是我认为是时候在NodeJS中使用诺言了。

 function foo(name, age = 42) { return new Promise(resolve => { setTimeout(() => resolve({name, age}), 1000); }); } //... foo('Sándor').then(x => console.log(x)); // { name:"Sándor", age:42 } 

使用ES6的承诺,你可以摆脱所谓的“callback金字塔”,并可以使用ES7 async-await关键字的function。 未来在这里!

 function foo(args, callback){ parsed = {name:"John Doe",age:12}; //default values for(a in args) parsed[a] = args[a]; //Arguments are accessible like parsed.name callback(parsed); } function callback(args){ alert(JSON.stringify(args)); } foo({name:"Peter",extra:2},callback);//yields {"name":"Peter","age":12,"extra":2} foo({name:"Mark",age:92},callback); //yields {"name":"Mark","age":92} foo({},callback); //yields {"name":"John Doe","age":12} 

说明

根据传递的参数数量,它可能看起来过于冗长。 这个概念应该是自我解释的,但是用语言来说,我们把参数分组在一个对象中,并且在函数内部有一个具有默认值的对象(如果需要的话)。 然后我们重写默认值,通过传递给我们一个非常清晰,干净的callback和冗长的参数。

请注意,如果传递额外的参数,那么在设置默认值的过程中不会丢失这些参数。