Javascript 确定回调是否使用所有参数
我想知道如何确定插件的用户是否正在使用回调函数的任何或所有参数。例如,我希望用户在使用回调时有可选的错误处理。代码如下:Javascript 确定回调是否使用所有参数,javascript,Javascript,我想知道如何确定插件的用户是否正在使用回调函数的任何或所有参数。例如,我希望用户在使用回调时有可选的错误处理。代码如下: function myFunc(userInput, callback) { switch (userInput) case 'someInput': var = data; if (someError) {var err = someError;} callback(err, data); break; } 现在,如果用户选择,他们可以在回调中查找
function myFunc(userInput, callback) {
switch (userInput)
case 'someInput':
var = data;
if (someError) {var err = someError;}
callback(err, data);
break;
}
现在,如果用户选择,他们可以在回调中查找错误,如下所示:
myFunc('someInput', function(err, data) {
console.log(err);
console.log(data);
});
但如果用户选择忽略任何错误,我仍然希望数据按如下方式发送:
myFunc('someInput', function(data) {
console.log(data);
});
但是,如果有错误,并且由于我已将任何错误声明为第一个参数,上面的示例将在
数据中记录所有错误消息,而不是数据本身。我如何知道用户何时不在回调中包含err
?js中的函数具有属性length
,显示函数的参数数量
(函数(x,y){}).length>>2
(function(){}).length>>0
编辑:请小心使用此方法。用户可以将回调定义为一个没有参数的函数,如function(){…}
,然后使用内部的arguments
列表查看传递的所有值。虽然您可以使用its检查函数的算术性,但这只会告诉您函数需要多少参数,而不会告诉您这些参数是什么或将如何处理它们
一个更传统的解决方案是将可选参数放在列表的最后,并从头开始填充。在这种情况下,数据
应该在错误
之前,因为它总是会被提供,而错误
可能不会。在大多数情况下,我更喜欢这种解决方案
另一个选项是使用命名参数,在JS中通过传递一个散列参数来实现,并允许函数从中获取所需的内容。然后您只需传递params
,类似于{data:x,err:y}
Node.js,您似乎正在模拟它,它使用错误优先回调模式。如果没有错误,它只传递第一个参数的null
。没有对回调的询问会影响回调的调用方式
任何嗅探参数的尝试都非常粗略。回调可能正在使用参数,而没有在函数签名中实际指定它们:
function() {
var args = arguments;
var err = args[0];
var data = args[1];
// do stuff
}
或者他们可能根本不在乎你的论点是什么
function() {
console.log("foo");
}
在可选参数前面,您只需传递一个包含两个值的对象:
callback({
error: err,
data: data
});
最终,插件的消费者必须遵守您的模式。保持一致就好了。。。不必担心他们如何利用这些价值观;这是他们的事。是否要反转参数?可选参数应该是最后一个,也是第一个必需参数。如果两者都是可选的,则使用一个参数,该参数是一个包含属性的对象。您可以使用参数来确定传递的所有参数的数量和类型。@JamesMontagne在node.js中,提供error
作为回调的第一个参数是很常见的,无论是否存在错误。并不是说这个问题是关于node.js的,而是这个模式与您的建议相冲突。@canon我最初是从node.js得到这个想法的。你知道它是如何在那里实施的吗?如果是这样,你介意解释一下吗?@canon我只是想澄清一下,我的评论实际上与你描述的node.js完全没有冲突。当我说“可选”时,我指的是一个可能传递也可能根本不传递的参数。如果参数总是被传递,但可能是空的,这在我描述的意义上不是可选的。这可能就是我想要的。我从node.js得到了这个完整的想法,它将错误处理添加到回调的第一个参数中。在客户端脚本编写中,我可能会使用这种方法。您提出了一些我没有想到的用例。谢谢你。正如我在原始问题的评论中所问的:你知道node.js如何将错误作为第一个参数处理吗?@user3669257它将错误对象或null
作为第一个参数传递。我明白了,谢谢!我认为你的答案是正确的,因为我觉得你已经解释了为什么我的方法不应该首先使用,因为我无法控制消费者如何使用我的插件。