我必须这样做
doSomething
.then(success)
.catch(failure);
成功和失败是回调函数,它们将在运行时获得它们的价值(我正在尝试编写一个模块)。
所以我必须知道作为回调发送的函数失败应该有一个参数。
因为回调应该像
function(error) {
// An error happened
}
JS中有没有这样做?或者任何可以进行此类检查的库?
修改
只是澄清一下。我想要一个使用我的模块的用户(不是最终用户)发送一个函数作为一个参数,它将成为一个回调,我想检查发送的函数(将被回调)是否需要足够的参数。我理解由一个人用它来照顾它。但为什么不试试?
答案 0 :(得分:6)
使用promise回调(您的then
和catch
处理程序),它们只会在调用时传递一个参数,并且将始终传递该参数。 (如果承诺遵守原生语义; 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.length
和bar.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
是本机承诺)。它表示当拒绝承诺时,将使用一个参数(拒绝原因)调用回调。
或任何可以进行此类检查的库?
你可以使用一个类型检查器,当你传递的函数没有预期的参数数量时,它会发出警告或抛出错误。