2016-02-26 44 views
0

我试图通过ipinfo.io帮助显示用户位置。我创建了流星服务器方法:HTTP.get不及时提供数据

ipLocate: function() { 
     HTTP.get("http://ipinfo.io", function(error, result) { 
     var place = JSON.parse(result.content); 
     city = place.city; 
     state = place.region; 
     }); 
     return [city,state]; 
    } 

它返回用户的城市和状态(但仅在第二次执行时)。

我做了一个全球性的辅助

Template.registerHelper('locationFull', function() { 

     // if (!Meteor.userId()) { 

     Meteor.call('ipLocate', function(error, result) { 
     response = result 
     Session.set('location', response); 
     }) 
     return Session.get('location'); 
} 

目前显示任何内容。

如果我手动运行客户端中的HTTP.get请求(来自我的ipLocate方法),它将返回城市和州,但只有在运行它两次后。

我怎样才能让我的城市和州在我的全球帮手页面加载返回。

回答

0

我最终把我的HTTP调用放在Template.onCreated()中,并在全局助手中返回了带有Session变量的变量集。

像:

Template.registerHelper('locationFull', function() { 
    return Session.get('locate'); 
    }); 

这个工作。

1

这是因为您正在异步运行请求。由于您的退货代码超出了HTTP.get回调(并且它必须是,否则会引发错误),因此没有任何价值。第二次返回值的原因是因为您将城市和州宣布为全局变量(在它们前面没有var限定符)。这样做的正确方法是将您获取的数据存储到发布到客户端模板的Mongo集合中。如果您不知道如何存储和发布数据,请检出Meteor Guide

+0

除了使用mongo之外,我可以以任何其他方式存储数据吗?我正在处理用户尚未登录的应用的预先认证部分。 – chackerian