javascript第一个参数path最后一个参数回调

时间:2011-08-27 03:28:33

标签: javascript node.js arguments express

我正在尝试围绕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是回调,中间的其他所有内容都是可选的?

2 个答案:

答案 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"

Demo.