关于javascript:流星奇怪的行为

Meteor strange behaviour

我正在测试Meteor拥有的一些例程,我想知道这是否是正常活动,或者我出了点问题...

我将逐步描述:

我发布我的收藏集以便只拥有我想要的

服务器/publish.js

1
2
3
4
5
6
7
Meteor.publish('decisions', function (decisionCursor) {
    return Decisions.find({ active: true }, { limit: 20, skip: decisionCursor });
});

Meteor.publish('decisionsToModerate', function (decisionCursor) {
    return Decisions.find({ active: false }, { sort: { createdAt: -1 }, limit: 1, skip: decisionCursor });
});

我订阅我的客户的两个收藏出版物

客户端/client.js

1
2
3
4
5
6
7
8
Meteor.startup(function () {
    SimpleSchema.debug = true;
    Session.setDefault('decisionCursor', 0);
    Deps.autorun(function () {
        Meteor.subscribe("decisions", Number(Session.get('decisionCursor')));
        Meteor.subscribe("decisionsToModerate", Number(Session.get('decisionCursor')));
    });
});

我设置了函数来检索两个集合,以防止每次都调用查询...

客户端/lib/environment.js

1
2
3
4
5
6
7
8
activeDecisions = function() {
    var decisions = Decisions.find({active: true});
    console.log(decisions.fetch().length); // PROBLEM HERE
    return decisions;
};
moderateDecisions = function() {
    return Decisions.find({active: false});
};

我创建了我的视图内容

客户端/视图/home/home.js

1
2
3
4
Template.home.activeDecisions = function() {
    var decisions = activeDecisions();
    return decisions;
};

您可以看到,在client / lib / environment.js上,我添加了一行,供您查看出现问题的地方...

当我去http://localhost:3000/铁路线负载时

1
2
3
4
this.route('home', {
    path: '/',
    layoutTemplate: 'masterLayout'
});

如果我有Chrome控制台,如我在client / lib / environment.js上所写,它将返回一行包含许多Decisions文档的行,在这种情况下,我只有3个活动的Decisions,但是Chrome会输出以下内容:

1
2
3
0 environment.js?9868bbbef2024c202fd33213ed060f067dadbe75:3
3 environment.js?9868bbbef2024c202fd33213ed060f067dadbe75:3
3 environment.js?9868bbbef2024c202fd33213ed060f067dadbe75:3

三行,第一行告诉我我有0个文档(什么?我有三个活动文档),接下来的两行告诉我我想知道的确切信息,我有三个文档。

我想要这个数字,因为我想在一个会话变量中设置它,每次调用该查询时都会更新,因为如果我在其他地方设置它(比如说Template.home.rendered),我将设置两个查询,那会更慢。

所以我看到的问题是我不知道为什么Meteor如果将查询解析为一个变量只告诉我写一次,那么它会向控制台写入三遍...如果我将会话设置为0,然后3,然后3 ...这可能会导致一些错误?


模板助手形成反应式上下文-如果其中的反应式变量得到更新,则助手将再次运行。因此,每当activeDecisions返回的光标更新时,您就会看到该行被打印到控制台。

该函数在首次渲染模板时打印0是完全合理的。请记住,呈现模板之前,您所订阅的文档可能尚未到达客户端。随着新文档的到达或更新,activeDecisions将再次进行评估。有关更多详细信息,请参阅我关于类似主题的博客文章。

回到最初的问题,您可以将会话变量设置为光标计数(顺便说一句,调用cursor.count()cursor.fetch().length更有效)。当该计数更新时,会话变量也将更新。由于会话变量是反应性的,因此将重新运行其所有依赖项,依此类推。