Перегрузка JavaScript с помощью обратного вызова
Следуя шаблону, рекомендованному в этом вопросе, где у нас есть что-то похожее:
function foo(a, b, opts) {
}
foo(1, 2, {"method":"add"});
foo(3, 4, {"test":"equals", "bar":"tree"});
Каким образом можно включить обратный вызов в качестве конечного параметра? У меня есть функция foo()
, которая должна иметь возможность обрабатывать оба:
foo(x, y, function() {
// do stuff
});
и
foo(x, y, z, function() {
// do stuff
});
Любые предложения?
Ответы
Ответ 1
Завершение работы со следующим решением:
foo(args) {}
foo({"x":"add", "callback": function() {
// do stuff
}});
foo({"x":"equals", "y":"tree", "callback": function() {
// do stuff
}});
И затем просто проверяем, является ли последнее значение аргумента функцией, ala @PaulP.R.O. решение выше:
if((arguments.length > 1) && (typeof arguments[arguments.length - 1] === 'function')) {
var callback = arguments[arguments.length - 1];
}
Ответ 2
Я бы сказал, просто используйте объект arguments:
function foo(a, b) {
// Do stuff
// Done stuff
var alength = arguments.length;
// If more than 2 arguments and last argument is a function
if(alength > 2 && typeof arguments[alength - 1] === 'function')
arguments[alength - 1].call(this);
}
Ответ 3
Итак, в основном вы хотите принять переменное количество аргументов, а затем обратный вызов как последний? Что-то похожее на то, как работает PHP array_udiff
?
Это довольно просто:
function foo() {
var args = [], l = arguments.length, i;
for( i=0; i<l; i++) args[i] = arguments[i];
var callback = args.pop();
// now you have your variable number of arguments as an array `args`
// and your callback that was the last parameter.
}
Ответ 4
Аналогично .apply
. (в отличие от .call
)
function foo(args, cb) {}
foo(['a', 'b', 'c'], function() {} );
И если вам нужно, вы можете поместить их в переменные, используя .shift
:
function foo(args, cb) {
var a = args.shift(),
b = args.shift();
// and so on...
}