Meteor Session API调用没有反应性行为?

时间:2016-05-23 02:35:28

标签: javascript meteor

我正在使用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);}
}

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

2 个答案:

答案 0 :(得分:1)

  1. 方法调用不是反应性数据源。
  2. HTTP GET请求也不是被动数据源。
  3. 顺便说一下:为什么首先将同步HTTP.get函数包装到异步函数中,然后再使用wrapAsync将其再次包装,使其再次同步?

    如果不至少轮询该端点,则无法使REST端点成为被动数据源。

答案 1 :(得分: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);
});