【问题标题】:Meteor Session API call not behaving reactively?Meteor Session API 调用没有反应?
【发布时间】:2016-05-23 11:08:38
【问题描述】:

我正在使用 Meteor 显示来自开放天气 api 的数据。虽然这可行,但我遇到的问题是它不会被动更新。这意味着我最终会刷新页面以查看更新的天气。

我认为罪魁祸首是我通过onCreated. 调用它以下是我的客户端代码。

Template.weather.helpers({
  youweather: function(){
    return Session.get('youweather');
  }
});

Template.weather.onCreated(function(){
  Meteor.call('calltheweatherman', function(err, res){
    if (err){Session.set('youweather', {error: err});}
    else {Session.set('youweather', res); return res;}
  });
});

我的服务器代码是这样的:

Meteor.methods({
  'calltheweatherman':function(){
    this.unblock();
    var apiUrl = 'http://api.openweathermap.org/data/2.5/weather?q=NorthKorea&units=imperial&appid=myapikeygoaway';
    var response = Meteor.wrapAsync(apiCall)(apiUrl);
    return response;    
  }});

var apiCall = function (apiUrl, callback){
  try {
    var response = HTTP.get(apiUrl).data;
    callback(null, response);
  } catch (error) {
    if (error.response) {
      var errorCode = error.response.data.code;
      var errorMessage = error.response.data.message;
    } else {
      var errorCode = 500;
      var errorMessage = 'Cannot access the API';}
    var myError = new Meteor.Error(errorCode, errorMessage);
    callback(myError, null);}
}

如上所述,虽然代码可以正常工作,但它不会在天气数据发生变化时更新。

【问题讨论】:

  • 不知this.unblock();是不是罪魁祸首。
  • @dubvfan87 立即尝试。看看能不能解决。
  • unblock 与此无关。没有理由相信这段代码首先会是反应式的。数据源是一个 REST 端点,它不是反应式的。除此之外,方法调用也不是反应式的。

标签: javascript meteor


【解决方案1】:

您进行的这些方法调用不是反应式的。您可以使用setInterval 使其在特定时间间隔重新运行,并从 API 获取更新的天气数据。

Template.eo_layout.onCreated(function(){
  Meteor.setInterval(function () {
    Meteor.call('calltheweatherman', function(err, res){
    if (err){Session.set('youweather', {error: err});}
    else {Session.set('youweather', res); return res;}
   });
  }, 1000);
});

【讨论】:

  • 大气上还有一个反应式方法包
【解决方案2】:
  1. 方法调用不是响应式数据源。
  2. HTTP GET 请求也不是响应式数据源。

顺便说一句:为什么要先将同步的 HTTP.get 函数包装成一个异步函数,然后再用 wrapAsync 再次包装它,让它再次同步?

如果不至少轮询该端点,就无法将 REST 端点设为反应式数据源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 2019-03-03
    • 2012-12-13
    • 2017-06-22
    • 2017-08-06
    • 1970-01-01
    • 2019-08-18
    相关资源
    最近更新 更多