Закрытие Javascript с помощью геокодера Google - PullRequest
1 голос
/ 24 февраля 2011

У меня все еще есть некоторые проблемы с закрытиями JavaScript и переменными ввода / вывода.

Я играю с API Google Maps для некоммерческого проекта: пользователи поместят маркер в gmap, и мне нужно сохранить местность (с координатами) в моей базе данных.

Проблема возникает, когда мне нужно сделать второй геокод, чтобы получить уникальные пары lat и lng для местоположения: скажем, два пользователя размещают маркер в одном городе, но в разных местах, я не хочу иметь одна и та же местность дважды в базе данных с разными координатами.

Я знаю, что могу сделать второй геокод после , когда пользователь выбирает местность, но я хочу понять, что я здесь ошибаюсь:

// First geocoding, take the marker coords to get locality.
geocoder.geocode(
  {
    'latLng': new google.maps.LatLng($("#lat").val(), $("#lng").val()),
    'language': 'it'
  },
  function(results_1, status_1){
    // initialize the html var inside this closure
    var html = '';
    if(status_1 == google.maps.GeocoderStatus.OK)
    {
      // do stuff here
      for(i = 0, geolen = results_1[0].address_components.length; i != geolen)
      {
        // Second type of geocoding: for each location from the first geocoding,
        // i want to have a unique [lat,lan]
        geocoder.geocode(
          {
            'address': results_1[0].address_components[i].long_name
          },
          function(results_2, status_2){
            // Here come the problem. I need to have the long_name here, and
            // 'html' var should increment.
            coords = results_2[0].geometry.location.toUrlValue();
            html += 'some html to let the user choose the locality';
          }
        );
      }
      // Finally, insert the 'html' variable value into my dom... 
      //but it never gets updated!
    }
    else
    {
      alert("Error from google geocoder:" + status_1)
    }
  }
);

Я пытался с:

  // Second type of geocoding: for each location from the first geocoding, i want
  // to have a unique [lat,lan]
  geocoder.geocode(
    {
      'address': results_1[0].address_components[i].long_name
    },
    (function(results_2, status_2, long_name){
      // But in this way i'll never get results_2 or status_2, well, results_2 
      // get long_name value, status_2 and long_name is undefined.
      // However, html var is correctly updated.
      coords = results_2[0].geometry.location.toUrlValue();
      html += 'some html to let the user choose the locality';
    })(results_1[0].address_components[i].long_name)
  );

И с:

  // Second type of geocoding: for each location from the first geocoding, i want to have
  // a unique [lat,lan]
  geocoder.geocode(
    {
      'address': results_1[0].address_components[i].long_name
    },
    (function(results_2, status_2, long_name){
      // But i get an obvious "results_2 is not defined" error (same for status_2).
      coords = results_2[0].geometry.location.toUrlValue();
      html += 'some html to let the user choose the locality, that can be more than one';
    })(results_2, status_2, results_1[0].address_components[i].long_name)
  );

Есть предложения?

EDIT:

Моя проблема заключается в том, как передать дополнительные аргументы внутренней функции геокодера:

function(results_2, status_2, long_name){
    //[...]
}

потому что, если я делаю это с помощью clousure, я связываюсь с исходными параметрами (results_2 и status_2)

1 Ответ

1 голос
/ 24 февраля 2011

Если я вас правильно понимаю:

Ваша проблема в первом примере состоит в том, что функция обратного вызова второго (самого внутреннего) геокода (которая добавляет строку к html) не будет выполнена к тому времениВы достигаете строки с комментарием Finally, insert the 'html' variable value into my dom....

. Вы фактически запускаете второй запрос геокода и затем вставляете html до завершения операции.


Относительно передачиВ качестве дополнительного аргумента для обратного вызова вы всегда можете создать функцию, которая создает и возвращает функцию:

например,

function(my_argument)<br> {<br> return(function(cb1,cb2) { ... });<br> }(my_argument_value);<br>

Затем вы можете передать все, что захотитедля my_argument_value, и самый внутренний код (...) увидит его, а также два аргумента обратного вызова.

Возвращаемое значение этой функции - это то, что вы передаете в качестве обратного вызова для вызова геокодирования.

...