如何检查作为Javascript参数传递的回调函数是否有参数?

时间:2018-05-07 16:18:38

标签: javascript node.js callback javascript-objects

我必须这样做

doSomething
    .then(success)
    .catch(failure);

成功和失败是回调函数,它们将在运行时获得它们的价值(我正在尝试编写一个模块)。

所以我必须知道作为回调发送的函数失败应该有一个参数。

因为回调应该像

function(error) {
// An error happened
}

JS中有没有这样做?或者任何可以进行此类检查的库?

修改

只是澄清一下。我想要一个使用我的模块的用户(不是最终用户)发送一个函数作为一个参数,它将成为一个回调,我想检查发送的函数(将被回调)是否需要足够的参数。我理解由一个人用它来照顾它。但为什么不试试?

3 个答案:

答案 0 :(得分:6)

使用promise回调(您的thencatch处理程序),它们只会在调用时传递一个参数,并且将始终传递该参数。 (如果承诺遵守原生语义; jQuery' Deferred并不总是如此。)

在一般情况下:

通常你不在乎,因为在JavaScript中,你可以使用比正式参数更少或更多的参数来调用函数。也就是说,这很好:



function foo(a) {
  console.log("a = " + a);
}
foo();        // Fewer arguments than params
foo(1, 2, 3); // More arguments than params




您不关心的另一个原因是该函数可以使用参数,即使它没有为它们声明形式参数,也可以使用rest参数或arguments伪数组(你& #39; ll了解此代码段暂时记录foo.lengthbar.length的原因):



function foo() {
  console.log("First argument: " + arguments[0]);
}
function bar(...rest) {
  console.log("First argument: " + rest[0]);
}
foo(1);                                    // First argument: 1
bar("a");                                  // First argument: a
console.log("foo.length = " + foo.length); // foo.length = 0
console.log("bar.length = " + bar.length); // bar.length = 0




因此,只需定义您的API将调用回调函数,然后执行此操作,并由API的用户决定,以确保他们正确使用您所称的回调。

在这些重要的场合,您可以使用函数length属性来了解它声明了多少个正式参数:



function foo(a) {
  console.log("a = " + a);
}
console.log(foo.length); // 1




请注意,这将告诉您声明了多少个正式参数...

  • ...不计算休息参数(...identifier
  • ...直到第一个带有默认值的参数(即使之后没有默认值)

例如:



function foo(a, b = false, c) { // b has a default value
  console.log("a = " + a);
}
console.log(foo.length); // 1, even though `c` has no default value,
                         // because `c` is after `b`






function foo(a, ...rest) {
  console.log("a = " + a);
}
console.log(foo.length); // 1, because the rest parameter doesn't count




答案 1 :(得分:1)

这可能是调用者强制执行回调的一定数量参数的反模式,但如果必须,您可以检查函数的length



function test() {}

function test1(a) {}

function test2(a, b) {}

console.log(test.length, test1.length, test2.length)




答案 2 :(得分:0)

  

我需要知道作为回调发送的函数是否应该有参数

您需要阅读要发送回调函数的文档。它将提到调用回调的方式(时间,频率和参数)。

对于failure,这意味着要阅读catch的文档(假设doSomething是本机承诺)。它表示当拒绝承诺时,将使用一个参数(拒绝原因)调用回调。

  

或任何可以进行此类检查的库?

你可以使用一个类型检查器,当你传递的函数没有预期的参数数量时,它会发出警告或抛出错误。