Перегрузка JavaScript с помощью обратного вызова - PullRequest
2 голосов
/ 23 марта 2012

В соответствии с шаблоном, рекомендованным в этот вопрос , где у нас есть что-то похожее на:

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
});

Есть предложения?

Ответы [ 4 ]

1 голос
/ 12 февраля 2013

Вы можете сделать аналогично .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...
}
1 голос
/ 23 марта 2012

Таким образом, вы хотите принять переменное количество аргументов, а затем обратный вызов в качестве последнего? Нечто похожее на то, как работает 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.
}
1 голос
/ 23 марта 2012

Я бы сказал, просто используйте объект аргументов:

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);
}
0 голосов
/ 24 марта 2012

Закончилось следующим решением:

foo(args) {}

foo({"x":"add", "callback": function() {
  // do stuff
}});


foo({"x":"equals", "y":"tree", "callback": function() {
  // do stuff
}});

И затем просто проверить, является ли значение последнего аргумента функцией, решение ala @ PaulP.RO выше:

if((arguments.length > 1) && (typeof arguments[arguments.length - 1] === 'function')) {
  var callback = arguments[arguments.length - 1];
}
...