繁体   English   中英

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

[英]Meteor Keeping track of server side var on the client side

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

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

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;
    }

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

TL; 博士

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

内存状态

这是您正在寻找的(不正确的)解决方案:

  1. 当作业开始时,写入服务器上的某个内存状态。 这可能看起来像一个全局或文件范围的变量,比如jobStates ,其中jobStates是一个对象,以用户 ID 作为键,状态字符串作为其值。
  2. 客户端应定期轮询服务器以获取当前状态。 请注意, autorunMeteor.call (没有强制autorun再次执行的反应状态)-您实际上需要通过setInterval每 N 秒轮询一次。
  3. 作业完成后,修改jobStates
  4. 当客户端看到完成状态时,通知用户并取消setInterval
  5. 因为在作业运行时服务器可能因多种原因重启(从而忘记其内存中的状态),所以我们需要为状态和作业本身建立一些容错能力。 每当更改时将作业状态写入数据库。 当服务器启动时,我们将把这个状态读回到jobStates
  6. 上面的模型假设只有一个服务器正在运行。 如果存在多个服务器实例,则每个实例都需要观察集合以写入自己的jobStates 或者,(2) 中的方法应该只读取数据库而不是实际将jobStates保存在内存中。

这种方法复杂且容易出错。 此外,它无论如何都需要将状态写入数据库,以便处理重启和多个服务器实例。

发布/订阅

  1. 随着作业状态的变化,将当前状态写入数据库。 这可能是针对作业状态的单独集合,也可能是包含用于执行作业的所有元数据的集合(有助于容错),也可能是作业正在生成的文档(如果有)。
  2. 向客户发布必要的文件。
  3. 在客户端订阅文档并在模板中使用简单的findfindOne向用户显示状态。
  4. 可选:定期使用同步的 cron 之类的东西清理状态文档。

如您所见,发布/订阅机制更容易实现,因为大部分工作都是由meteor 为您完成的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM