【问题标题】:I have trouble getting a function to execute correctly before template loading在加载模板之前,我无法正确执行函数
【发布时间】:2016-01-12 03:02:52
【问题描述】:

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

我有一个问题,我通过 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% 的时间不工作,而在 mainPage 模板上 100% 的时间工作并刷新以重新加载。

【问题讨论】:

    标签: meteor


    【解决方案1】:

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

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

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

    【讨论】:

    • 我尝试创建会话变量,一个在函数开头表示初始化,一个在函数末尾表示完成,但我看到的大部分是微调器永远旋转.我觉得 computeValues() 函数甚至开始以这种方式运行。
    • 在计算结束时会话变量是否正确设置?
    • 好吧,我添加了 2 个会话。一个用于启动和功能完成时的内容。路由器的动作块如下所示:action: function(){ if(Session.get("initiation")){ this.layout("loading"); if(Session.get("initiationComplete")){ this.layout("mainPage"); } }
    • IMO 你最好用一个。只需在开始和结束时切换它。
    • waitOn 是您通常希望在 IR 中放置订阅的位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    相关资源
    最近更新 更多