Meteor在客户端保持跟踪服务器端var

时间:2016-03-21 03:07:15

标签: javascript meteor reactive-programming meteor-blaze

这里的第一个问题,但我真的不知道去哪里。我在谷歌上找不到任何可以帮助我的东西。

我正在做巨大的处理服务器端,我想跟踪状态并在客户端显示它。 为此目的,我有一个变量,我正在更新过程。为了跟踪它,我正在使用该客户端:

Template.importJson.onCreated(function () {
    Session.set('import_datas', null);
    this.autorun(function(){
        Meteor.call('readImportState', function(err, response) {
            console.log(response);
            if (response !== undefined) {
                Session.set('importingMessage',response);
            }
        });
    })
});

我正在从模板中读取它(在template.mytemplate.helpers中):

readImportState: function() {
        return Session.get('importingMessage');
    },

以下是meteor.call调用的服务器端代码:

readImportState: function() {
        console.log(IMPORT_STATE);
        return IMPORT_STATE;
    }

客户端在开始时获取值,但以后永远不会更新.... 我在这里失踪了什么? 如果有人能指出我正确的方向,那将是非常棒的。 谢谢:))

1 个答案:

答案 0 :(得分:1)

TL; DR

在撰写本文时,在服务器和客户端之间共享反应状态的唯一简单方法是使用发布/订阅机制。其他解决方案就像打一场艰苦的战斗。

内存状态

这是您正在寻找的(错误的)解决方案:

  1. 当作业开始时,写入服务器上的某些内存状态。这可能看起来像全局或文件范围的变量,如jobStates,其中jobStates是一个以用户ID作为其键的对象,并将状态字符串作为其值。
  2. 客户端应定期轮询服务器以获取当前状态。请注意,autorun不适用于Meteor.call(没有强制状态强制autorun再次执行) - 您需要通过{{1}实际每N秒轮询一次}。
  3. 作业完成后,修改setInterval
  4. 当客户端看到已完成状态时,请通知用户并取消jobStates
  5. 由于服务器在作业运行时可能由于多种原因而重启(因此忘记了其内存状态),因此我们需要为状态和作业本身构建一些容错。无论何时更改,都将作业状态写入数据库。当服务器启动时,我们会将此状态读回setInterval
  6. 上述模型假设只有一台服务器正在运行。如果存在多个服务器实例,则每个服务器实例都需要observe该集合才能写入其自己的jobStates。或者,(2)中的方法应该只读取数据库而不是实际将jobStates保留在内存中。
  7. 这种方法很复杂且容易出错。此外,它还需要将状态写入数据库,以便处理重新启动和多个服务器实例。

    发布/订阅

    1. 当作业状态更改时,将当前状态写入数据库。这可以是针对作业状态的单独集合,也可以是具有用于执行作业的所有元数据的集合(有助于容错),或者可以是作业正在生成的文档(如果有)。
    2. 将必要的文件发布给客户。
    3. 在客户端上订阅文档,并在模板中使用简单的jobStatesfind向用户显示状态。
    4. 可选:使用类似synced cron的内容定期清理状态文档。
    5. 正如您所看到的,发布/订阅机制更容易实现,因为流星为您完成了大部分工作。