Геокодирование адресов через API карт Google и откладывание результатов

Я использую Google Maps API для геокодирования двух адресов. Я откладываю возвращенные результаты и использую $.when().then() способ выполнить мою логику, как только я получу координаты для строковых адресов. Проблема в том, что API всегда возвращает результат как разрешенный, даже если есть ошибка. Например, если нет соединения с интернетом вместо истечения времени ожидания запроса, я получаю статус ERROR и результат как null или если я введу неверный адрес, я получу статус ZERO_RESULTS и привести пустой массив [], Поскольку меня интересует только получение правильных результатов координат, я хочу обрабатывать все остальные ответы как ошибку геокодирования, чего я не знаю, как это сделать. Вы также можете видеть, что перед геокодированием я должен проверить, являются ли поля ввода пустыми из-за той же проблемы.

Я только знакомлюсь с асинхронным потоком и нуждаюсь в руководстве. Я использую jquery 1.9.2 и Google Maps APIv3. (Я могу жестко программировать все условия, но я хочу улучшить свои навыки кодирования и получить что-то более общее. Это возможно.)

Я также приведу свой код здесь.

function geocode(addString) {
 var deferred = $.Deferred();
 var geocoder = new google.maps.Geocoder();
 var request = {
  address: addString
 };
 geocoder.geocode(request, function(results, status) {
  if (status === google.maps.GeocoderStatus.OK) {
    deferred.resolve(results[0].geometry.location);
  }
  else {
    // no idea what to do here
  }
});
 return deferred;
}

function Options() {
 var origin = $("#origin-field").val();
 var destination = $("#destination-field").val();
 if (origin != "" && destination != ""){
  var originCoords = geocode(origin);
  var destinationCoords = geocode(destination);
  $.when(originCoords, destinationCoords)
  .then(function(originCoordinates, destinationCoordinates) {
    console.log(originCoordinates.lat() + ',' + originCoordinates.lng());
    console.log(destinationCoordinates.lat() + ',' + destinationCoordinates.lng());
 }, function() {
    toastMessage("Geo-coding error");
  });
 }
 else {
  toastMessage("Origin and/or Destination missing");
 }
}

1 ответ

Я решил свою проблему благодаря этому примеру. Как я уже сказал, я только начал смотреть на асинхронный поток, поэтому не знал, как решить эту простую проблему. Я просто поймал всехOK статусы в блоке else и передал его deferred.reject() метод. Так что мой код стал таким.

function geocode(addString) {
 var deferred = $.Deferred();
 var geocoder = new google.maps.Geocoder();
  var request = {
   address: addString
  };
  geocoder.geocode(request, function(results, status) {
   if (status === google.maps.GeocoderStatus.OK) {
     deferred.resolve(results[0].geometry.location);
   }
   else {
    deferred.reject(status);
   }
 });
 return deferred;
 }

function Options() {
 var origin = $("#origin-field").val();
 var destination = $("#destination-field").val();
 var originCoords = geocode(origin);
 var destinationCoords = geocode(destination);
 $.when(originCoords, destinationCoords)
 .then(function(origin, destination) {
    //some logic in case of success
    }, function(status) {
  toastMessage("Geo-coding error:" + status);
 });
}
Другие вопросы по тегам