使用出版物为订阅创建进度条

using publications to create a progressbar for subscriptions

我多次调用 Google Analytics API 并将该数据加载到订阅中。现在我想创建一个进度条来通知用户正在加载数据,并显示需要多长时间。

我读到最好使用发布将数据从服务器传递到客户端。这是真的吗?

我在服务器上创建了以下发布。 执行的操作如下:

  1. 设置初始 progressValue 和 id 为 1 的初始发布
  2. 如果progressValue小于100就继续循环,告诉1的发布正在改变。
  3. 在此代码下方,我有另一篇文章 运行,其中 progressValue 是在循环中逐步设置的。

查看客户端时,只会发布最后一个 progressValue。在此之前,我收到了很多空数组。所以就像:

[]
[]
[]
[]
...
Progress publication 

我想要的是客户端接收 progressValue 的每一个变化,而不是只接收最后一个。我该如何解决?

订阅进度条的制作方法如有更好的建议,也采纳这些回答

if (Meteor.isServer) {
  let progressValue = 0;

  Meteor.publish('progress', function() {
    const self = this;
    let lastProgressValue = 0;

    const id = 1;

    self.added('progress', id, {
      progress: progressValue,
      total: 100,
    });


    while (progressValue < 100) {
      self.changed('progress', id, {
        progress: progressValue,
        total: 100,
      });
  }
 self.ready();      
  });
...

嗯...所以,这里有几件事。

I read that it's best to use publications to pass data from server to client. Is this true?

这就是Meteor的全貌,使用ddp。意味着数据从服务器自动发送到客户端。因此,操作数据的大部分工作实际上是使用 minimongo 在客户端处理的。

查看这篇文章,对 'automagic' 部分进行很好的讨论...

http://richsilv.github.io/meteor/meteor-low-level-publications/

你是怎么进步的?

您不想尝试在服务器端处理递增。相反,您希望获得服务器的简单计数,也许使用反应式聚合(请在此处查看我的回答 How to reactively aggregate mongodb in meteor)并将其发送给客户端。因此,服务器将计数作为发布并告诉客户端“57”即将到来。

然后作为你正常的数据发布,你将这57条记录发送给客户端。在客户端上,你现在做的和在服务器上做的基本上是一样的,但是由于客户端只收到了 57 条数据记录中的一部分,你可以通过将客户端收到的消息除以服务器消息总数来有效地得到一个进度计数器待发送。

总结

在服务器上 - 2 个发布,1 个用于要发送的记录计数的反应式聚合,1 个用于发送的普通数据

在客户端 - 计算本地 minimongo 集合中的记录的函数 - collection.find({}).count() - 可以解决问题。这将随着客户端从服务器接收到每条记录而递增。

进度就像客户端计数除以服务器发送的待交付计数一样简单。