gpt4 book ai didi

javascript - meteor 的奇怪行为

转载 作者:行者123 更新时间:2023-12-03 12:35:09 30 4
gpt4 key购买 nike

我正在测试 Meteor 的一些例程,我想知道这是正常事件还是我出了问题...

我将逐步描述:

我发布我的收藏是为了只拥有我想要的东西

服务器/publish.js

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

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

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

client/lib/environment.js

activeDecisions = function() {
var decisions = Decisions.find({active: true});
console.log(decisions.fetch().length); // PROBLEM HERE
return decisions;
};
moderateDecisions = function() {
return Decisions.find({active: false});
};

我创建我的 View 内容

client/views/home/home.js

Template.home.activeDecisions = function() {
var decisions = activeDecisions();
return decisions;
};

如您所见,在 client/lib/environment.js 上,我添加了一行供您查看问题所在...

当我访问http://localhost:3000/iron-routes 加载

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

如果我有 Chrome 控制台,正如我在 client/lib/environment.js 上写的那样,它应该返回一行包含许多 Decisions 文档,在本例中我只有 3 个有效决策,但 Chrome 输出如下:

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

三行,第一行告诉我我有 0 个文档(什么?我有三个事件文档)接下来的两行准确地告诉我我想知道什么,我有三个文档。

我想要这个数字,因为我想将它设置在 session 变量中,每次调用该查询时该变量都会更新,因为如果我将其设置在其他位置(例如Template.home.rendered) >) 我将进行两个查询,这会比较慢。

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

最佳答案

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

首次渲染模板时,函数打印 0 是完全合理的。请记住,在呈现模板之前,您订阅的文档可能尚未到达客户端。当新文档到达或更新时,将再次评估 activeDecisions。更多详情请看我的blog post关于类似的主题。

回到原来的问题,您可以将 session 变量设置为游标计数(顺便说一句,调用 cursor.count() 比调用 cursor.fetch().length 更有效)。当该计数更新时,您的 session 变量也会更新。因为 session 变量是 react 性的,所以它的所有依赖项都将再次重新运行,依此类推。

关于javascript - meteor 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23770224/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com