我正在尝试围绕expressjs的app.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) {
}
让它们同时工作,就像在快递中一样。
那么如何编写一个知道第一个arg是路径的包装函数,最后一个arg是回调,中间的其他所有内容都是可选的?
答案 0 :(得分:3)
有几种选择。一种是检查传递的参数类型以确定传递的内容。如果您只想修改一个参数并且知道它在特定位置传递,您可以只创建参数数组的副本,修改该参数并使用.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);
}
}
对于第二个选项,这是一个通用版本,允许您修改path参数并通过所有其他参数传递:
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));
}
答案 1 :(得分:2)
您可以使用该功能提供的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"