暂停插入直到函数返回结果

时间:2014-12-01 15:05:31

标签: meteor

在我的visits集合中,我有geocodeVisit功能,该功能使用Google地理编码服务对地址进行地理编码。问题是流星脚本通常在加载谷歌地图API之前运行,导致Exception while invoking method 'visitInsert' ReferenceError: google is not defined错误。所以我需要等待inser直到地理编码完成。我怎样才能做到这一点?这是visits集合:

Meteor.methods({
  visitInsert: function(visitAttributes) {
    check(Meteor.userId(), String);
    check(visitAttributes, {
      nr: String,
      visit_date: String
    });

    var properties = {
      userId: Meteor.userId(),
      position: geocodeVisit(visitAttributes.address)
    };

    var visit = _.extend(visitAttributes, properties);
    var visitId = Visits.insert(visit);
    return {
      _id: visitId
    };
  }
});

geocodeVisit = function (address) {
  this.unblock;
  var geocoder = new google.maps.Geocoder();
  geocoder.geocode( { 'address': address}, function(results, status) {
    if (status == google.maps.GeocoderStatus.OK) {
      return results[0].geometry.location;
    }
  });
}

1 个答案:

答案 0 :(得分:0)

您应该将文件下载到" / lib"而不是在HTML代码中使用脚本标记包含地图api。目录。在运行任何Meteor代码之前,将加载该目录中的所有内容。


此外,您将遇到与代码异步的问题。您正尝试从geocodeVisit函数中的成功回调中返回值。我能看到的两种方法是:

  1. 了解如何使用maps api进行同步请求。也许这个:Synchronous request in Node.js
  2. 继续并插入没有位置信息的访问。然后对地图api进行地理编码请求,并在响应返回后更新条目。就个人而言,这是我采取的方法。