【问题标题】:Poll HTTP endpoint in Meteor在 Meteor 中轮询 HTTP 端点
【发布时间】:2017-05-15 13:32:08
【问题描述】:

我正在尝试从 API 获取一些信息并将此信息保存到 mongodb 集合中,最后以反应方式显示此信息。当页面被加载时,它会完美地完成。如果我在 mongo 中进行手动更新,视图也会立即更改。但是第一次加载后,页面不再发出新请求,因此不再刷新外部数据。

我知道meteor 会查找内部数据更改,但我没有找到任何可以查找外部更改或循环发出请求的内容。

<template name="scanner">
  {{#each scan}}
    <img src="img/antenna.png" height="25" width="25" style={{position_scanner x y}}
      id="{{addr}}" title="{{tip_text addr name}}" >
  {{/each}}
</template>

Template.scanner.helpers({
  scan: function() {
    Meteor.call("get_scanners");
    return Scanners.find({});
  }
});

Meteor.methods({
  get_scanners: function (){
    var url = "http://192.168.60.154:5008/api-ot/scanners";
    try {
      var result = HTTP.get(url);
      var statusCode = result.statusCode;
      var data = result.data.scanners_list;
      for (var x in data) {
        var scanner = data[x];
        Scanners.update({ addr: scanner.addr }, scanner, { upsert: true });
      }
    } catch (e) {
      console.log("Cannot get scanner data");
    }
  }
});

【问题讨论】:

  • 你想做什么?您希望多久刷新一次该外部 API?
  • 我有一个返回某些信标数据的 API。我想得到这个信标的位置,然后在蓝图中打印。我不知道,也许每 10 秒刷新一次可能是一个不错的尝试。
  • 是否需要在用户登录时继续刷新,还是仅在他们查看特定页面时继续刷新?相同的数据是否会发布给所有用户? (从您的代码看起来像)
  • 事实上,只有一个用户,我希望刷新是不可阻挡的。

标签: meteor single-page-application


【解决方案1】:

由于您希望每 10 秒进行一次外部呼叫,您可以在 Meteor.startup() 中使用 Meteor.setInterval() 来安排它。您正在更新 Scanners 集合,该集合可以通过发布和订阅发送到客户端,不需要 Meteor.call()

Meteor.startup(() => {
  Meteor.setInterval(() => {
    const = "http://192.168.60.154:5008/api-ot/scanners";
    try {
      const data = HTTP.get(url).data.scanners_list;
      data.forEach(scanner => {
        Scanners.update({ addr: scanner.addr }, scanner, { upsert: true });
      });
    } catch (e) {
      console.log("Cannot get scanner data");
    }
  },10000); // run every 10 seconds == 10000 msec
});

【讨论】:

  • 成功了,谢谢米歇尔。我只是做了一些调整,但是这个功能设置间隔救了我的命。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多