【问题标题】:locals variable not updating correctlylocals 变量没有正确更新
【发布时间】:2018-01-11 01:20:29
【问题描述】:

我正在显示集合中的一堆页面,因此为了让它们在我的视图中可用,我在 app.js 中初始化了一个全局 locals 变量,如下所示:

Page.find({}).sort({ sorting : 1}).exec(function(err, pages){
    if (err) {
        console.log(err);
    } else {
        app.locals.pages = pages;
    }
});

效果很好。然而,我也有能力重新排序这些页面的显示方式,所以在我重新排序之后,我在同一条路线上从上面重做Page.find(),但它似乎总是落后一步。

因此,如果我通过重新排序(我们称之为reorder 1)进行更改,之后我看不到app.locals.pages 的差异,但如果我再次重新排序(我们称之为reorder 2,那么我会看到reorder 1 排序而不是 reorder 2 等等,所以基本上它总是落后一步。

路线中的相关代码:

    for (var i = 0; i < ids.length; i++) {
        var id = ids[i];
        count++;
        (function(count) {
            Page.findById(id, function (err, page) {
                page.sorting = count;
                page.save(function (err) {
                    if (err)
                        console.log(err); 
                });
            });
        })(count);
    }

    Page.find({}).sort({sorting: 1}).exec(function (err, pages) { // this is always a step behind
        if (err) {
            console.log(err);
        } else {
            req.app.locals.pages = pages;
        }
    });

为什么不是最新的?

【问题讨论】:

  • 我没有完全理解你的问题,哈哈。你想做什么?
  • @boubaks 在 for 循环运行并且 db 中的值发生变化后, req.app.locals.pages 不会反映最新的变化。

标签: javascript node.js express mongoose


【解决方案1】:

好的,那我明白你的问题了。

问题是你的page.save 比你的for 花费更多的时间 因此,您的 find 之后将得到与之前几乎相同的结果。

你在哪里使用它(for)?走特殊路线?

简单的异步 javascript 问题 ;)

```

function sortPages(ids, callback) {
  var total = 0;
  for (var i = 0; i < ids.length; i++) {
    var id = ids[i];
    count++;
    (function(count) {
        Page.findById(id, function (err, page) {
            page.sorting = count;
            page.save(function (err) {
                ++total;
                if (err)
                    console.log(err);
                if (total >= ids.length) {
                  callback('done');
                }
            });
        });
    })(count);
  }
}

sortPages(ids, function () {
  Page.find({}).sort({sorting: 1}).exec(function (err, pages) {
      if (err) {
          console.log(err);
      } else {
          req.app.locals.pages = pages;
      }
  });
});

```

【讨论】:

  • 是的,在 for 循环中使用闭包之前,我也遇到了 for 循环的问题,它没有正确更新。它都在同一条路线上,for循环,然后是page.save,有什么补救措施吗?
  • 你必须将第一个返回到一个函数中,它会得到一个回调我会给你写一个例子(你也可以使用 Promise,但第一次使用回调更容易理解)
  • 我用回调示例 @VojislavKovacevic 编辑了我的消息另外,如果 Page.findById 抛出错误,我也没有管理,所以你还必须检查
猜你喜欢
  • 2015-03-31
  • 1970-01-01
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多