我认为问题在于路由,但我可能在这里错了。
我遇到一个问题,我通过Iron Router调用的函数有时在模板渲染之前没有完全完成必要的计算,并且页面填充了n / a和NaN(因为计算未在模板之前完成加载或渲染)。所以会发生什么是在用户登录后,他/她通过外部文件上传数据。然后将此数据系统地添加到现有的MongoDB集合中,然后通过函数computeValues()
进行计算。
正如我上面所说,我的问题是有时候computeValues()
函数没有完全完成必要的计算,但模板仍会呈现。当我刷新此页面时,该过程按预期工作。只有在我遇到此问题时才从一个页面路由到此特定模板/页面(称为mainPage
)。然后,还有其他实例,它的工作方式与预期相同,模板在函数执行之前不会呈现,并完全计算数据。
以下是Iron Router的特定代码:
Router.route("/analyze/main", {name: "main",
subscriptions: function(){
return Meteor.subscribe("data");
},
onBeforeAction: function(){
if(! Meteor.user()){
this.layout("accessDenied");
} else{
this.next();
}},
action: function(){
this.wait(computeValues());
if(this.ready()){
this.layout("mainPage");
} else{
this.layout("loading");
}
}});
这是我添加到模板的onRendered()函数中的内容:
Template.mainPage.onRendered(function(){
computeValues();
});
添加或删除模板的onRendered部分是没有理由的。问题仍然存在。我只是无法弄清楚造成这种情况的原因或解决方法。
执行所有计算的特定函数computeValues()
位于lib文件夹中,因为需要加快加载过程并立即访问全局变量。我无法发布代码,因为它超过3000行。但是这个函数的广泛性并没有解释为什么它在路由时有20%的时间工作,而且80%的时间都没有工作,所有这些都在100%的时间在mainPage
模板上工作并刷新重新加载
答案 0 :(得分:0)
你可以使用IR来 waitOn 一个或多个订阅,但它不太适合等待一组计算。
首先,我会将computeValues()
移至Template.mainPage.onCreated
而不是onRendered
其次,我会在开始计算时将会话变量设置为false,并在完成时将其设置为true,并在模板中显示一个微调器,直到它变为真。