【问题标题】:Trying to iterate through an array and add a get function for each尝试遍历数组并为每个数组添加一个 get 函数
【发布时间】:2013-11-03 22:38:33
【问题描述】:

我想遍历样式标签并为每个标签编写一个 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]);
  });
}

【问题讨论】:

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


    【解决方案1】:

    我不完全清楚您要问什么问题,但我确实看到您在回调中使用 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);
    }
    

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

    如果这不是您要问的问题(尽管它仍然需要修复),那么请更详细地描述您要问的问题。

    【讨论】:

    • 这里有常见问题解答吗?这个问题几乎每天都会出现。
    • 这完全回答了我的问题。谢谢!
    【解决方案2】:

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

    我有点惊讶这不起作用,因为我认为这些路由的声明将是同步的。

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

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

    【讨论】:

      【解决方案3】:

      不要在 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();
      }
      

      【讨论】:

        猜你喜欢
        • 2022-10-01
        • 2018-04-07
        • 1970-01-01
        • 1970-01-01
        • 2020-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多