如何在jQuery express中使用路由闭包

时间:2014-04-13 15:00:24

标签: jquery node.js express closures

我正在尝试在jQuery中设置一堆路由,它们调用相同的函数但使用不同的参数。我想以功能性的方式做到这一点,以便于阅读,扩展等......

在:

app.get('/p/:p1',             p1);
app.get('/p/:p1/:p2',         p2);
app.get('/p/:p1/:p2/:p3',     p3);
app.get('/p/:p1/:p2/:p3/:p4', p4);

我想做的是这样的事情:

var path = '/p';
for (var i = 1; i <= 4; ++i) {
  path += '/:p' + i;
  debug('adding path for "%s"', path);
  app.get(path, function(req, res) { p(i, req, res) });
}

不幸的是,p()始终使用i = 5进行调用,无论采用哪种路线。

2 个答案:

答案 0 :(得分:1)

创建一个新的范围,其中i的值被锁定,否则循环将结束,而i将是异步app.get()执行时设置的持续时间

var path = '/p';
for (var i = 1; i <= 4; ++i) {
  (function(j) {

      path += '/:p' + j;
      debug('adding path for "%s"', path);
      app.get(path, function(req, res) { p(j, req, res) });

  })(i);
}

答案 1 :(得分:0)

另一种解决方案是让p()返回一个函数:

var path = '/p';
for (var i = 1; i <= 4; ++i) {
  path += '/:p' + i;
  debug('adding path for "%s"', path);
  app.get(path, p(i));
}

function p(i) {
  return function(req, res) {
    debug('i = ' + i );
    // ....
  };
}