2015-09-28 2 views
2

Я пытаюсь выполнить геолокацию с помощью API Карт Google для события beforeSave для Parse Cloud. Проблема заключается в том, что httpRequest не запускается между процессом.Google Geolocation on beforeSave

Вот мой код:

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, чтобы продолжить сохранение данных. Таким образом, во время этого процесса есть некоторые данные, у которых нет значений lat-long, поэтому я должен проверить, имеют ли они long-long, если они не хотят делать запрос Geolocation, используя адрес записи w/Google Maps API для получения значений lat-long.

Любые идеи о том, как я могу выполнять геолокацию с помощью API Карт Google во время beforeSave?

Благодаря

+0

Почему вы запрашиваете, чтобы найти объект, когда он новый, и поэтому не должен существовать в хранилище данных? Итак, если это не ново, ничего не делайте, и если оно новое, найдите существующий элемент (который не должен существовать) и только сделайте запрос, если мы его найдем. Это кажется нелогичным, поэтому вам нужно более подробно объяснить, что вы делаете. – Wain

+0

@ Извините, я не очень хорошо объяснил, что делает мой код. Итак, в этой части я проверил, существует ли новая запись, и если она существует, я просто обновляю значения и выполняю 'response.error', который сигнализирует' parseObject.save() ', чтобы не продолжать сохранять object, else я возвращаю 'response.success', говорящий' parseObject.save() ', чтобы продолжить сохранение новых данных. Причина, по которой я хотел выполнить поиск геолокации, заключается в том, что мне нужно получить латентные точки для существующих данных, потому что некоторые данные не включают latlong, поэтому мне нужно выполнить проверку, включают ли они значения latlong. – Renesansz

ответ

0

Когда вы звоните reaponse успеха или ошибки вы сигнализации, что функция будет завершена, так что ничего после этого не гарантирует полной, особенно если это асинхронный.

Вы должны сделать асинхронный запрос и обновить переданный объект, а затем вернуть успех, чтобы сохранить его.

+0

Спасибо за идею, я должен выполнить запрос Parse.Promise и запросить цепочку запроса. Теперь он работает правильно. – Renesansz

Смежные вопросы