尝试遍历数组并为每个数组添加get函数

时间:2013-10-25 00:39:30

标签: javascript node.js for-loop express closures

我想遍历样式标签并为每个标签写一个GET函数。问题是GET函数是用'styleTags [i]'编写的,而不是将'styleTags [i]'转换为适当的标记。

var styleTags = ['cont', 'ecce'];

for (var i = 0; i < styleTags.length; i++) {
  app.get('/photos-' + styleTags[i], selectNav, function(req, res) {
    getDynPhotos(req, res, styleTags[i]);
  });
}

3 个答案:

答案 0 :(得分:2)

我不完全清楚你问的是什么问题,但我确实看到你在回调中使用i时遇到了问题。由于app.get()可能是异步的,并且稍后会完成,因此i的值仍然无效。您需要创建一个捕获i值的闭包。有几种方法可以做到这一点。这是使用立即调用的函数表达式(通常缩写为IIFE)的一种方式:

var styleTags = ['cont', 'ecce'];

for (var i = 0; i < styleTags.length; i++) {
  (function(index) {
      app.get('/photos-' + styleTags[index], selectNav, function(req, res) {
        getDynPhotos(req, res, styleTags[index]);
      });
  })(i);
}

这会冻结我命名为i的函数参数中index的值,因此在调用回调的时候它仍然具有正确的值。

如果这不是你要求的(虽然它仍然需要修复),那么请详细描述你的问题。

答案 1 :(得分:1)

不要在Node中使用for循环,因为它不会创建closure。相反,我建议async.each

var async = require('async');
var styleTags = ['cont', 'ecce'];

async.each(styleTags, function(styleTag, callback) {
  app.get('/photos-' + styleTag, selectNav, function(req, res) {
    getDynPhotos(req, res, styleTag);
  });
callback();
}

答案 2 :(得分:0)

我看到你正在尝试构建一个Node.js Express路由。

我有点惊讶这没用,因为我认为这些路线的声明是同步的。

您能看一下app.routes看看Node为您准备了什么吗?我猜你可能已经这样做了,但我想我会提到它。

如果不起作用,我有两个建议:在路线中使用正则表达式来隔离路线的类别部分(然后在请求时验证路线),或者将路线直接插入app.routes对象结构。