1

我多次调用 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();      
  });
...
4

1 回答 1

0

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

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

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

看看这篇文章,对“自动”部分进行很好的讨论......

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

你是如何进步的?

您不想尝试在服务器端处理增量。相反,您想获得服务器的简单计数,可能使用反应性聚合(请参阅我的回答如何在流星中反应性聚合 mongodb)并将其发送到客户端。因此,服务器将其计为发布并告诉客户端“57”到来。

然后作为您的正常数据发布,您将 57 条记录发送给客户端。在客户端上,您现在基本上与在服务器上执行相同的求和操作,但由于客户端仅接收到 57 条数据记录中的一部分,您可以通过将客户端接收到的服务器消息总数除以有效地获得进度计数器被发送。

概括

在 SERVER - 2 个发布上,1 个响应式聚合用于要发送的记录计数,1 个作为要发送的正常数据

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

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

于 2017-08-13T12:31:22.750 回答