javascript первый аргумент путь последний аргумент обратный вызов - PullRequest
3 голосов
/ 27 августа 2011

Я пытаюсь написать функцию-обертку вокруг приложения expressjs. Get

Get (и другие методы) принимают в качестве аргументов путь, некоторые опции, а затем обратный вызов. Но иногда вы можете оставить опции и по-прежнему работать.

Раньше я делал:

app.get(path, auth.loadUser, function () { 
  // example
})

так что это не работает:

custom.get = function (path, callback) {
  // ?? missing a spot in the arguments array
  app.get(path, auth.loadUser, function () { 
    // example
  })
}

Мне нужно быть в состоянии сделать это:

custom.get (path, callback) {
}

и это:

custom.get (path, auth.loadUser, callback) {
}

и пусть они работают одновременно, как в экспрессе.

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

Ответы [ 2 ]

3 голосов
/ 27 августа 2011

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

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

custom.get = function(path, option, callback) {
    // option is an optional parameter
    if (!callback || typeof callback != "function") {
        callback = option;   // callback must be the second parameter
        option = undefined;  // no option passed
    }
    if (option) {
        app.get(path, option, callback);
    } else {
        app.get(path, callback);
    }

}

Для второго варианта, вот общая версия, которая позволяет вам изменить аргумент пути и передать все остальные параметры через:

custom.get = function() {
    // assumes there is at least one parameter passed
    var args = [].slice.call(arguments);    // make modifiable copy of arguments array
    var path = args[0];

    // do whatever you want with the path

    args[0].path = path;
    return(app.apply(this, args));
}
2 голосов
/ 27 августа 2011

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

var custom = {
    get: null
};

custom.get = function(path, callback) {
    alert(arguments[0] + " " + arguments[1].bar + " " + arguments[arguments.length - 1]);
}

custom.get("foo", { bar: "bar" }, "baz"); // alerts "foo bar baz"

Демо.

...