使用长 运行 进程时的 Meteor 反应最佳实践

Meteor reactivity best practices when working with long running processes

这是我正在尝试提出一个好的解决方案的场景。

  1. 用户单击浏览器中的按钮。
  2. 显示流程微调器。
  3. 在服务器上执行一个方法。
    3.1.方法将消息添加到队列。
    3.2.方法将 message idstatus 存储在 Mongo 集合中。
    3.3.方法 returns 与浏览器相同的消息 ID。
  4. 在将来的某个时候,相同 message idstatus 会在 Mongo 数据库中更新。
    4.1 流程微调器不再显示

处理步骤 4.1 的最佳方法是什么?我真的很想避免每隔几秒执行一次 AJAX 请求以确定消息状态的老式方法。

我对你的确切问题了解不够,无法给出准确的答案,所以这是我的假设:

  1. 有一个名为 Queue 的集合,其中包含所有正在处理的请求。
  2. Queue 中与当前用户相关的所有条目均已发布。
  3. 在处理用户的任何项目时都应显示微调器(如果不是这样,则只需稍作修改)。

这是一个示例 autorun,它将根据需要切换微调器元素:

Template.myTemplate.onCreated(function() {
  this.autorun(function() {
    if (Queue.find({status: 'processing'}).count()) {
      $('#spinner').show();
    } else {
      $('#spinner').hide();
    }
  });
});

或者,您可以直接在模板中切换微调器,如下所示:

<template name="myTemplate">
  {{#unless isQueueEmpty}}
    <div class="spinner"></div>
  {{/unless}}
</template>
Template.myTemplate.helpers({
  isQueueEmpty: function() {
    return Queue.find({status: 'processing'}).count() === 0;
  }
});

使用微调器组件创建一个 'displaySpinner' 模板,并使用 template.helper 'processing' 有条件地显示它,如果项目状态为 'processing',则 returns 为真:

{{#if processing}}
  {{> displaySpinner}}
{{/if}}