确定回调是否使用所有参数

时间:2015-02-13 18:03:53

标签: javascript

我想知道如何确定我的插件的用户是否正在使用我的回调的任何或所有参数。例如,我希望用户在使用我的回调时有可选的错误处理。这是代码:

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);
});

但是,如果出现错误并且因为我已将任何错误声明为第一个参数,则上面的示例将记录data中的任何错误消息,而不是数据本身。我怎么知道用户何时没有在回调中包含err

3 个答案:

答案 0 :(得分:1)

js中的函数具有属性length,它显示函数的参数数量。

(function(x,y){}).length >> 2

(function(){}).length >> 0

编辑:请注意这种方法。用户可以将回调定义为不带function(){...}之类参数的函数,然后在里面使用arguments列表查看所有传递的值。

答案 1 :(得分:1)

虽然您可以使用length property来检查函数的arity,但这只会告诉您函数期望的参数数量,而不是它们是什么或它将对它们做什么。

更传统的解决方案是将可选参数放在列表的最后,并从头开始填写。在这种情况下,data应该在err之前,因为它始终会提供,err可能不会。在大多数情况下,我更喜欢这种解决方案。

另一种选择是使用命名参数,通过传递一个哈希的参数在JS中实现,并允许该函数从那里获取它想要的东西。然后,您只需传递params,就像{data: x, err: y}一样。

答案 2 :(得分:0)

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
});

在一天结束时,插件的使用者必须符合您的模式。只要保持一致......不要担心他们对这些价值观做了什么;这是他们的事。