locals变量未正确更新

时间:2017-08-03 12:26:28

标签: javascript node.js express mongoose

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

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;
        }
    });

为什么不是最新的?

1 个答案:

答案 0 :(得分:0)

Okey,然后我理解你的问题。

问题不是你的page.save花费的时间多于for 所以在你的发现之后会得到几乎与以前相同的结果。

你在哪里使用它(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;
      }
  });
});

```