在模板加载之前,我无法正确执行函数

时间:2016-01-11 18:32:29

标签: meteor

我认为问题在于路由,但我可能在这里错了。

我遇到一个问题,我通过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模板上工作并刷新重新加载

1 个答案:

答案 0 :(得分:0)

你可以使用IR来 waitOn 一个或多个订阅,但它不太适合等待一组计算。

首先,我会将computeValues()移至Template.mainPage.onCreated而不是onRendered

其次,我会在开始计算时将会话变量设置为false,并在完成时将其设置为true,并在模板中显示一个微调器,直到它变为真。