我正在尝试构建一个学习应用程序,目前需要从subreddit获取前7个帖子,然后如果尚未在数据库中将其添加到数据库中。然而,由于某种原因它同时运行if和else 7次,我无法弄清楚原因。这是辅助方法:
Template.posts.helpers({
posts : function () {
Meteor.call('getPosts', "tifu", function(e, results){
var result = JSON.parse(results.content).data.children;
Session.set('postsResults', result);
});
for(var i=0; i<7; i++){
var result = Session.get('postsResults')[i].data;
if(Posts.find({r_id: result.id}).count() == 0){
console.log("if");
} else {
console.log("else");
};
};
return Posts.find();
}
});
和html方面:
<template name="posts">
<div class="col-md-12 posts-div">
{{#each posts }}
<div class="col-md-8">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">{{ title }}</h3>
</div>
<div class="panel-body">{{{ body }}}</div>
<div class="panel-footer">
<div class="col-md-2">{{ score }}</div>
<div class="col-md-2 col-md-offset-3">{{ subreddit }}</div>
<div class="col-md-2 col-md-offset-3">{{ createdBy }}</div>
<div class="clearfix"></div>
</div>
</div>
</div>
<div class="col-md-4">
<div class="panel panel-primary">
</div>
</div>
{{/each}}
</div>
<hr>
</template>
我已经用简单的控制台日志替换了插入代码,这些是我得到的结果:
if
if
if
if
if
if
if
else
else
else
else
else
else
else
当我在控制台中运行Posts.find({r_id: result.id}).count() == 0
时,我得到与Posts.findOne({r_id: result.id}) == null
相同的错误但由于某种原因,在javascript文件中它仍然运行真正的部分,然后我最终得到50个相同的副本发布这是我想避免的。
答案 0 :(得分:1)
在帮助程序中使用Meteor.call
并不是最佳选择。每次有反应变化时,助手的function
都会重新运行。这就是它运行这么多次的原因。
改为使用Template.onCreated
回调:
Template.posts.onCreated(function() {
Meteor.call('getPosts', "tifu", function(e, results){
var result = JSON.parse(results.content).data.children;
Session.set('postsResults', result);
});
});
你的助手:
Template.posts.helpers({
posts : function () {
var r = Session.get('postsResults')
for(var i=0; i<7; i++){
if(!r) continue;
var result = r[i].data;
if(Posts.find({r_id: result.id}).count() == 0){
console.log("if");
} else {
console.log("else");
};
};
return Posts.find();
}
});
要记住的第二件事是Session.get('postsResults')
将null
,同时返回Meteor.call
的结果,持续几百毫秒。如果你做Session.get('postsResults')[i].data
,你将获得例外。
这就是为什么我添加条件检查以在r
为空时继续循环。这样,您等待结果,posts
function
将重新运行,并使用新数据重新计算结果。