Обратные вызовы Javascript и необязательные параметры - PullRequest
13 голосов
/ 27 февраля 2011

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

Ex:

функция сохранения (цвет, размер, вес, обратный вызов) {...}

Если цвет и обратный вызов являются обязательными, а размер и вес - необязательными. Так что, если кто-то хочет вызвать эту функцию только цветом и обратным вызовом ...

save ('blue', function (...) {...}) {...}

 save('blue', 56, function(...) { ... }) { ... }

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

Ответы [ 7 ]

13 голосов
/ 27 февраля 2011

Объект параметра хорошо решает вашу проблему, например так:

function save(params, callback) {
    params.color = params.color || 'default';
    params.size = params.size || 0;
    params.weight = params.weight || 0;

    // ...

    if (callback instanceof Function) { callback(); }
}

Используйте вот так:

save({ color: 'blue', weight: 100 }, function () { /* ... */ });
8 голосов
/ 27 февраля 2011

Аргументы JavaScript должны быть выровнены с ожидаемыми параметрами позиционно, поэтому пропуск аргумента между другими передаваемыми не будет работать.Один из вариантов - передать необязательные аргументы в один объект.

// callback is required
// additional arguments are passed as props of 'options'
function save(options, callback) { 
    var color = options.color || 'blue';
    var size = options.size || 72;
}

Передать их следующим образом:

save({ color: 'red' }, function() {});
4 голосов
/ 27 февраля 2011

Вы можете проверить arguments.length, чтобы увидеть, сколько аргументов было передано, и проверить, является ли typeof weight === 'function', чтобы увидеть, является ли аргумент обратным вызовом или нет.

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

1 голос
/ 01 февраля 2017

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

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

function optional_params(color, size, weight, callback){
    // set callback to itself or the next optional paramater until you have checked all optional paramaters
  callback = callback || weight || size;
    // check if weight is a function(the callback) or undefined and if so set to a default value, otherwise set weight as weight
  weight = typeof weight != 'function' && typeof weight != 'undefined' ? weight : "1.2kg";
    // do the same as above with weight
  size = typeof size != 'function' && typeof size != 'undefined' ? size : "L";
    // invoke callback
  callback(color,size,weight);
}

И использование:

optional_params("Red",function(color,size,weight){
  console.log("color: " + color); // color: Red
  console.log("size: " + size); // size: L //(default)
  console.log("weight: " + weight); // weight: 1.2kg //(default)
});
1 голос
/ 27 февраля 2011

Вы можете проверить типы аргументов: http://jsfiddle.net/wknVA/.

0 голосов
/ 12 апреля 2013

Я рекомендую ArgueJS для этого!

function save() {
  arguments = __({color: undefined, size: [undefined], weight: [undefined], callback: Function})

  // access your args by arguments.paramName. Ex.:
  // alert(arguments.color)
...
}

Вы также можете проверить тип аргументов, изменив undefined на нужные типы.

0 голосов
/ 27 февраля 2011

В дополнение к ответу SLaks, вызывающий не всегда может предположить, что он может отправлять любые аргументы, которые он хочет, лучше всего документировать функцию, аргументы которой являются необязательными, для разработчика вызова функции, проверки типа argгруппировка необязательных аргументов до конца списка аргументов - другие.Создание двух дополнительных опций одного типа требует путаницы.

...