如何强制Meteor立即重新发布,或优先考虑反应式更新?

如何强制Meteor立即重新发布,或优先考虑反应式更新?,meteor,reactive-programming,meteor-blaze,Meteor,Reactive Programming,Meteor Blaze,我正在尝试构建自己的加载微调器,设置它的方法是使用一个助手来检查条目数组是否为空 {{#if viewThisPage}} {{#if noEntriesLoaded}} <div class="loadingSpinner">...</div> {{/if}} {{#each entry}} {{ > myTemplate}} {{/each}} {{/if}} {{#如果查看此页面} {{{#如果未加载EntriesLoaded

我正在尝试构建自己的加载微调器,设置它的方法是使用一个助手来检查条目数组是否为空

{{#if viewThisPage}}
  {{#if noEntriesLoaded}}
    <div class="loadingSpinner">...</div>
  {{/if}}
  {{#each entry}}
    {{ > myTemplate}}
  {{/each}}
{{/if}}
{{#如果查看此页面}
{{{#如果未加载EntriesLoaded}
...
{{/if}
{{{#每个条目}
{{>myTemplate}}
{{/每个}}
{{/if}
最初,viewThisPage为false。当viewThisPage设置为true时,我会查询mongoDB中的条目。我从基准测试中看到的问题是,查询速度太快,以至于所有DOM更新事件都挤在一起,以至于微调器永远不会被渲染,换句话说,noEntriesLoaded在很短的时间内都是真的

然而,在触发viewThisPage和页面实际呈现之间大约有1200毫秒的延迟。我希望微调器在此滞后期间显示

我想了三种方法来解决这个问题

  • 在设置viewThisPage后,在条目尚未加载的情况下,以某种方式强制meteor立即重新加载该部分
  • 以某种方式对viewThisPage的响应进行优先级排序,以便在加载entires之前进行更新
  • 在添加条目的块上使用setTimeout()添加假滞后。这是有效的,我可以看到我漂亮的加载旋转器,但这是有史以来最愚蠢的想法

  • 可以在渲染条目时显示微调器

    仅当呈现所有条目时,此代码才会隐藏loadingSpinner:

    meteor add reactive-var
    
    另外,在呈现
    条目
    模板之前,您可能需要检查条目是否已加载

    <template name="Main">
      {{#if viewThisPage}}
        {{#if entriesAreNotReady}}
          <div class="loadingSpinner">...</div>
        {{/if}}
        {{> Entries entry=entry onRendered=onEntriesRendered}}
      {{/if}}
    </template>
    
    <template name="Entries">
      {{#each entry}}
        {{> myTemplate}}
      {{/each}}
    </template>
    
    Template.Main.onCreated(function() {
      this.areEntriesRendered = new ReactiveVar(false);
    });
    
    Template.Main.helpers({
      onEntriesRendered: function() {
        var areEntriesRendered = Template.instance().areEntriesRendered;
    
        return function() {
          areEntriesRendered.set(true);
        };
      },
    
      entriesAreNotReady: function() {
        return ! Template.instance().areEntriesRendered.get();
      }
    });
    
    Template.Entries.onRendered(function() {
      this.data.onRendered();
    });