我想遍历样式标签并为每个标签写一个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]);
});
}
答案 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
对象结构。