如何在Meteor中从服务器向客户端发送消息?

时间:2016-11-23 10:52:57

标签: javascript mongodb meteor meteor-blaze

我想从服务器/ main.js'中的服务器脚本发送消息。到客户/ main.js'中的Cliente脚本。

我尝试了一些发布/订阅的东西,但我一定做错了。流星服务器运行的控制台发疯了数以千计的错误消息。

服务器

Meteor.publish("test", function () {
    this.ready();
    return 'some test';
  });

客户端

Template.panel.onCreated(function loginOnCreated() {
  Tracker.autorun(function () {
    const handle = Meteor.subscribe('test');
    if(handle.ready()){
      alert('Done')
    }
  });
});

无论如何,我需要一种服务器方法在客户端准备就绪时调用它。

原因:Template.panel.onCreated无法从Mongodb查询数据。它必须等待几秒钟。所以我想在客户端的Template.panel.onCreated中做不到的事情。它必须等到Mongo准备好了。

我该怎么做?

3 个答案:

答案 0 :(得分:1)

您应该将Meteor.subscribe放在Tracker.autorun之外。

我认为问题是因为handle是一个被动数据源,所以当它改变Tracker.autorun重新运行时的函数时,它再次订阅服务器,创建一个新的句柄并且新的handle导致函数再次运行。这会一遍又一遍地循环并向控制台发送许多错误消息

答案 1 :(得分:1)

  

它必须等待几秒钟。

我假设您从Mongo检索的数据对于dom人口是必要的。 对于任何等待过程,您可以使用加载器。你可以通过设置一个“错误”的帮助来做到这一点。直到你没有收到服务器的回复。获得该响应后,填充dom并将此字段设置为true。

类似的东西:

{{#if dataLoaded}}
  {{domYouWantToPopulate}}
{{else}}
  {{spinner}} //your loading icon template
{{/if}}

或者即使你不需要dom的数据仍然加载图标,停止用户做一些事情,直到收到数据。

所以看到的是,假设您正在开发中,您只有客户端,但在实际情况下,您将拥有一台服务器和许多客户端。因此,从服务器调用每个客户端上的客户端功能是错误的处理和可行性指标。这就是为什么我们有API来从服务器获得响应,因此服务器只能向响应该API的客户端发送响应。

答案 2 :(得分:0)

您可以通过更新数据库来执行此操作,并且客户端帮助程序方法会警告服务器想要说些什么,或者您可以使用这样的包:

https://atmospherejs.com/raix/eventddp

它允许服务器启动的消息传递。我没有尝试过,但它来自一个很好的来源