1

我正在尝试从我的节点应用程序中删除匿名函数。例如:

app.post('/page-edit.json', function (req, res) {
    db.get(req.body.page_id, function (err, doc) {
        res.contentType('json');
        res.send(doc);
    });
});

所以说我打破了内部功能:

function innerMost(err, doc) {
    res.contentType('json');
    res.send(doc);
}

function outer(err, doc) {
     db.get(req.body.page_id, innerMost);
}


app.post('/page-edit.json', outer);

问题是,我如何将额外的参数(如“res”)传递给“innerMost”?它在这个过程中迷失了。

如果您想查看源代码(或者甚至想为开源项目做出贡献!),您可以在这里查看

4

3 回答 3

0

我倾向于使用 Function.bind() 将事物分开,因此您不需要弄乱 Function 的原型、外部库等。

function innermost(req, res, e, r){
    res.end(r)
}

function somedbfunc(q, cb){
    cb(null, 'db results');
}

function outer(req, res){
    somedbfunc('query', innermost.bind(this, req, res));
}

app.all('*', outer)
    ==> "db results"
于 2013-08-15T04:37:42.043 回答
0

听起来您正在寻找的是currying(也称为“函数的部分应用”),它基本上可以让您提前预填充一些参数的值。

John Resig 对此有一篇很好的文章

从他的文章中获取一些代码,您可以创建partial如下函数:

Function.prototype.partial = function(){
    var fn = this, args = Array.prototype.slice.call(arguments);
    return function(){
      var arg = 0;
      for ( var i = 0; i < args.length && arg < arguments.length; i++ )
        if ( args[i] === undefined )
          args[i] = arguments[arg++];
      return fn.apply(this, args);
    };
};

在你的情况下,像这样使用它:

function innerMost(err, doc, req, res) {
    res.contentType('json');
    res.send(doc);
}

function outer(req, res) {
    //partially apply `innerMost` here by passing in `req` and `res`
    db.get(req.body.page_id, innerMost.partial(undefined, undefined, req, res));
}

app.post('/page-edit.json', outer);

请注意,此代码未经测试。

于 2013-08-15T00:32:27.777 回答
0

这可能是您可以使用常规 JS 做的最好的事情:

function outer(req, res) {
    function innerMost(err, doc) {
        res.contentType('json');
        res.send(doc);
    }

    db.get(req.body.page_id, innerMost);
}

app.post('/page-edit.json', outer);

但是,您可能想查看各种异步库,例如https://github.com/caolan/async。如果您想进一步冒险,可以考虑使用 icedcoffeescript http://maxtaco.github.io/coffee-script/,我认为这非常好。

于 2013-08-15T00:03:58.007 回答