2015-09-28 85 views
2

我正在尝试使用Google地图API解析云的beforeSave事件进行地理定位。问题是在进程之间没有触发httpRequest。Google地理位置之前保存

这里是我的代码:

Parse.Cloud.beforeSave('SearchList', function (request, response) { 

    if (! request.object.isNew()) 
     response.success(); 

    var SearchList = Parse.Object.extend('SearchList'); 
    var query = new Parse.Query(SearchList); 

    query.equalTo('Id', request.object.get('Id')); 
    query.first({ 
     success: function (entry) { 

      if (entry) { 

       var address = request.object.get('Street1') + ', ' + request.object.get('Street2') + ', ' + request.object.get('Street3') + ', ' + request.object.get('Suburb') + ', ' + request.object.get('State') + ', ' + request.object.get('Postcode'); 

       for (var attr in request) { 
        entry.set(attr, request[attr]); 
       } 
       entry.set('Address', address); 

       if (request.object.get('Type') === 'Bus') { 

        address = request.object.get('Street1') + ', ' + request.object.get('State'); 
        console.log('Bus Address: ' + address); 
        Parse.Cloud.httpRequest({ 
         method: 'POST', 
         url: 'https://maps.googleapis.com/maps/api/geocode/json', 
         params: { 
          address : address, 
          key: 'my-api-key' 
         }, 
         success: function(httpResponse) { 

          var response = httpResponse.data; 

          if (response.status === 'OK') { 
           var langLat = response.results[0].geometry.location; 
           console.log(langLat); 

           entry.set('Location', new Parse.GeoPoint({ latitude: Number(langLat.latitude), longitude: Number(langLat.longitude) })); 
           entry.save(); 
           response.error('Updated Existing Entry'); 
          } 

         }, 
         error: function(httpResponse) { 
          entry.set('Location', null); 
          entry.save(); 
          response.error('Updated Existing Entry'); 
         } 
        }); 
       } else { 
        entry.set('Location', new Parse.GeoPoint({ latitude: Number(request.object.get('Latitude')), longitude: Number(request.object.get('Longitude')) })); 
        entry.save(); 
        response.error('Updated Existing Entry'); 
       } 

      } else { 
       response.success(); 
      } 

     }, 
     error: function (err) { 
      response.error('Could not validate uniqueness for the Id object.'); 
     } 
    }); 

}); 

所以是保存在我的代码呢,我查了入口如果它已经存在于数据库。如果存在,我简单地更新它的值,然后返回response.error告诉parseObject.save不继续保存数据,因为它已经存在,否则我返回response.success告诉parseObject.save继续保存数据。因此,在这个过程中,有些数据没有经纬度值,所以我必须检查它们是否具有纬度长度,如果他们不想要使用条目地址带有Google地图的地理位置查询API来检索经纬度值。

有关如何在beforeSave期间使用Google Maps API执行地理定位的任何想法?

感谢

+0

为什么在查询新对象时查询对象,因此不应该存在于数据存储中?因此,如果它不是新的,则什么都不做,如果是新的,找到现有的项目(不应该存在),只有在找到它时才发出请求。这似乎不合逻辑,所以你需要更详细地解释你在做什么 – Wain

+0

@很抱歉,我没有很好地解释我的代码是干什么的。 因此,在这部分,我检查了新条目是否已经存在,如果它存在,我只需更新值并执行一个'response.error',它表示'parseObject.save()'不会继续保存对象,否则我返回一个'response.success'告诉'parseObject.save()'继续保存新的数据。我之所以要进行地理定位搜索,是因为我需要为现有数据获得一个latlong点,因为有些数据不包含latlong,所以我必须执行检查它们是否包含latlong值。 – Renesansz

回答

0

当你调用reaponse成功或错误你信令功能齐全,所以以后什么不保证完成的,特别是如果它是异步的。

您应该进行异步请求并更新传递的对象,然后返回成功进行保存。

+0

感谢您的想法,我必须实施一个Parse.Promise请求,并链接请求。它现在正常工作。 – Renesansz