Проблемы с функцией обратного вызова

0

Здесь у меня есть функция calculateDistance, которая должна вернуть мне расстояние между двумя местами и временем, поэтому я пишу:

 function calculateDistances(start,stop) {
  var service = new google.maps.DistanceMatrixService();
  service.getDistanceMatrix(
    {
      origins: [start],
      destinations: [stop],
      travelMode: google.maps.TravelMode.DRIVING,
      unitSystem: google.maps.UnitSystem.METRIC,
      avoidHighways: false,
      avoidTolls: false
    }, callback);
}
  function callback(response, status) {
  if (status != google.maps.DistanceMatrixStatus.OK) {
    alert('Error was: ' + status);
  } else {
    var origins = response.originAddresses;
    var destinations = response.destinationAddresses;


    for (var i = 0; i < origins.length; i++) {
      var results = response.rows[i].elements;
      for (var j = 0; j < results.length; j++) {
       var xxx= "";
        xxx += origins[i] + ' to ' + destinations[j]
            + ': ' + results[j].distance.text + ' in '
            + results[j].duration.text + '<br>';
     return xxx;
      }
    }
  }
}

после этого я пишу код для реализации этой функции в моем js-коде:

//Start function for calculate distance
        var start = document.getElementById("from").value;
        var stop = place.formatted_address;
        contentStr += '<p>'+ calculateDistances(start,stop); + '</p>';

        //I open rendered HTML in jquery dialog when user click on marker
        $(contentStr).dialog({
          modal:true
      });

Я просто получаю HTML: undefined и в консоли: Uncaught TypeError: Cannot read property '__e3_' of null

Как я могу решить эту проблему? ПОЛНЫЙ КОД: http://jsbin.com/EVEWOta/96/edit

Теги:
callback
google-maps
function

1 ответ

1
Лучший ответ

Служба DirectionsService является асинхронной. Вы не можете "вернуть" результаты из функции обратного вызова. Вы должны использовать результаты, когда они возвращаются сервером (в функции обратного вызова). Не испытано:

 function calculateDistances(start,stop) {
  var service = new google.maps.DistanceMatrixService();
  service.getDistanceMatrix(
    {
      origins: [start],
      destinations: [stop],
      travelMode: google.maps.TravelMode.DRIVING,
      unitSystem: google.maps.UnitSystem.METRIC,
      avoidHighways: false,
      avoidTolls: false
    }, callback);
}
  function callback(response, status) {
  if (status != google.maps.DistanceMatrixStatus.OK) {
    alert('Error was: ' + status);
  } else {
    var origins = response.originAddresses;
    var destinations = response.destinationAddresses;
    var xxx= "";

    for (var i = 0; i < origins.length; i++) {
      var results = response.rows[i].elements;
      for (var j = 0; j < results.length; j++) {

        xxx += origins[i] + ' to ' + destinations[j]
            + ': ' + results[j].distance.text + ' in '
            + results[j].duration.text + '<br>';
      }
      var contentStr += '<p>'+ xxx + '</p>';
    }    
    //I open rendered HTML in jquery dialog when user click on marker
    $(contentStr).dialog({
      modal:true
    });
  }
}

//Start function for calculate distance
var start = document.getElementById("from").value;
var stop = place.formatted_address;
calculateDistances(start,stop);
  • 0
    спасибо, но не работает ... Я буду отмечать этот ответ как хороший, поэтому еще раз спасибо, но это не решение моей проблемы
  • 0
    Когда вы говорите «не работает», что вы имеете в виду? Код не был проверен, могут быть синтаксические ошибки. Если это что-то еще, то я все еще не понимаю ваш вопрос. Может быть, вы можете предоставить более подробную информацию о том, что вы пытаетесь сделать.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню