带有Session变量的Meteor无限循环

时间:2016-05-16 06:36:15

标签: session meteor reverse geocode

我对Meteor很新,有问题,无法弄清楚如何解决它。

我想在集合中存储日期。我可以使用谷歌地图来取消会议地点,这给我一个带坐标的字符串。 我用jaymc反转地理编码坐标:google-reverse-geocode,这基本上是可行的(我可以在console.log中得到结果)。

使用Session变量时,我可以输出结果,但它们会不断变化。命令到达那里结果,然后第一和第二个条目改变他们的结果,然后他们再次改变,依此类推。

我尝试使用ReactiveVar和ReactiveDict但没有结果。我无法从reverseGeocode函数返回任何结果。

以下是代码:

{{#each termine}}
   <div class="listTermine">
   <p class="title">{{title}}</p>
   <p class="desc">{{desc}}</p>
   <p class="location">{{getAddress}}</p>
   <p class="dates">
   <span class="glyphicon glyphicon-time" aria-hidden="true"></span>
  {{formatDate startDate}} bis {{formatDate endDate}}
  </p>
</div>
{{/each}}


Template.showTermine.helpers({
    getAddress: function() {
        var locArray = Termine.findOne({
            "title": this.title
        }, {
            fields: {
                locations: 1
            }
        });
        latlngArray = locArray.locations.toString();
        var latlong = latlngArray.split(",");
        var lat = latlong[0];
        var lng = latlong[1];
        reverseGeocode.getLocation(lat, lng, function(location) {
                Session.set('location', reverseGeocode.getAddrStr());
            })
            // commented out to prevent infinite loop
            //return Session.get('location');
    }
});

2 个答案:

答案 0 :(得分:1)

这是因为 Reactive 变量(如 Session 变量)将导致其包含的整个函数在每次更改时重新运行。

因此,Session.set()Session.get()功能相同,因此每次调用getAddress时都会重新运行Session.set()函数,在循环中重新运行。

由于您将结果返回到同一个函数中,因此您根本不需要 Session 变量:

你可以简单地说:

reverseGeocode.getLocation(lat, lng, function(location) {
                return reverseGeocode.getAddrStr();
            })

如果这不起作用(因为您正在对.getLocation进行异步调用),那么您应该在其他地方执行此调用

执行此操作的最佳位置是Template.mytemplate.onCreated()事件

Template.showTermine.onCreated(function() {
        var locArray = Termine.findOne({
            "title": this.title
        }, {
            fields: {
                locations: 1
            }
        });
        latlngArray = locArray.locations.toString();
        var latlong = latlngArray.split(",");
        var lat = latlong[0];
        var lng = latlong[1];
        reverseGeocode.getLocation(lat, lng, function(location) {
                Session.set('location', reverseGeocode.getAddrStr());
        })});

Template.showTermine.helpers({
  "getAddress": function() {
     return Session.get("location");
  }
});

答案 1 :(得分:0)

在回调中调用set,它将在helper返回get之后执行,这意味着当它设置变量时助手因会话值的变化而重新失效并重新运行。

一些可能的修复: 移动代码将var设置为onCreated或onRendered方法,并删除帮助器返回的所有内容

或者 确保最初将会话var创建为空值,然后添加if检查以在尝试调用位置服务或设置var之前查看var的值。

Reactive vars是通过重复模板的会话的正确方法,以避免会话中的命名空间冲突,同样的建议应该适用于反应变量或会话变量。只是避免设置并在同一帮助器中获得任何反应,而无需进行一些检查以确定是否需要