Как проверить, имеет ли функция обратного вызова, переданная в качестве параметра в Javascript, аргументы или нет? - PullRequest
0 голосов
/ 07 мая 2018

Я должен сделать это

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

А успех и неудача - это функции обратного вызова, которые получат свое значение во время выполнения (я пытаюсь написать модуль).

Так что я должен знать, что сбой функции, который отправляется как обратный вызов, должен иметь параметр.

Потому что обратный вызов должен быть похож на

function(error) {
// An error happened
}

Есть ли в JS что-либо сделать для этого? Или какая-нибудь библиотека, которая делает такую ​​проверку возможной?

EDIT

Просто чтобы уточнить. Я хочу, чтобы пользователь (не конечный пользователь), который использует мой модуль, отправлял функцию в качестве параметра, который станет обратным вызовом, и я хочу проверить, достаточно ли параметров для отправленной функции, которая будет вызываться обратно, достаточно. Я понимаю, что это зависит от того, кто использует это, чтобы позаботиться об этом. Но почему бы не попробовать?

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

С обратным вызовом обещания (ваши обработчики 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 (вы поймете, почему этот фрагмент журналы 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
0 голосов
/ 07 мая 2018

Мне нужно знать, должен ли параметр, отправляемый в качестве обратного вызова, иметь параметр

Вам необходимо прочитать документацию по функции, в которую вы отправляете обратный вызов. Здесь будет упомянуто, как (когда, как часто и с какими аргументами) вызывается обратный вызов.

Для вашего failure это означает чтение документов для catch (при условии, что doSomething является нативным обещанием). В нем говорится, что обратный вызов будет вызываться с одним аргументом, причиной отклонения, когда обещание отклонено.

Или любая библиотека, которая делает такую ​​проверку возможной?

Вы можете использовать средство проверки типов, которое предупредит вас или выдаст ошибку, если передаваемая функция не имеет ожидаемого количества параметров.

0 голосов
/ 07 мая 2018

Для вызывающей стороны, вероятно, запрещен ввод определенного количества аргументов обратного вызова, но при необходимости вы можете проверить length функции:

function test() {}

function test1(a) {}

function test2(a, b) {}

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