【问题标题】:Meteor Keeping track of server side var on the client sideMeteor 在客户端跟踪服务器端 var
【发布时间】:2016-07-07 11:01:51
【问题描述】:

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

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

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

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

【问题讨论】:

  • 为什么不直接将状态写入文档,然后将所述文档发布给客户端?这似乎更简单。
  • 嘿!感谢您的回答。通过文件,我认为您的意思是收藏?如果是这样,只是我没有看到仅为一个真正特定于单个模板的字符串状态创建集合的意义。
  • 当我说“似乎”时,我很客气——我应该说“是”。请参阅下面我的回答,以了解(希望)有说服力的论据来说明原因。

标签: javascript meteor reactive-programming meteor-blaze


【解决方案1】:

TL;DR

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

内存状态

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

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

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

发布/订阅

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

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

【讨论】:

  • 哇哦。感谢您的详细评论,我想,我不应该过多地担心使用集合。来自 mysql 背景,我仍然倾向于使用表/集合,它是如何在 sql 数据库上使用的。我想我别无选择,只能使用订阅/发布。感谢您的详细回答。
猜你喜欢
  • 2018-07-24
  • 1970-01-01
  • 2017-05-28
  • 1970-01-01
  • 2014-07-04
  • 2011-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多