2011-02-23 41 views
1

我仍然有一些問題與JavaScript關閉和輸入/輸出變量。Javascript關閉與谷歌地理編碼器

我玩谷歌地圖API爲一個沒有盈利項目:用戶將標記放入一個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) 
    } 
    } 
); 

我tryed有:

// 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) 
); 

任何建議嗎?

編輯:

我的問題是如何通過一個額外的參數傳遞給地理編碼器內部函數:

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

becose如果我這樣做了clousure,我惹的原始參數( results_2和status_2)

+0

想到的第一件事是確保第二組回調甚至可以通過使用console.log來調用。另外,即使按順序運行第二組地理編碼,也不能保證函數回調將按順序運行。如果附加到html變量,它可能會失靈。只是想一想。 – 2011-02-23 22:05:00

+0

是的,我刪除了所有的控制檯。在發佈代碼之前登錄。 無論如何,你對訂單問題的含義是什麼?我知道請求是異步的,但(我猜)第二個地理編碼是第一個,所以它不應該在第一個之前執行。我錯了嗎? – Strae 2011-02-23 22:07:42

回答

1

如果我正確理解你:

你在T問題他的第一個示例是,第二個(最內層)地理編碼的回調函數(將字符串附加到html)在到達Finally, insert the 'html' variable value into my dom...註釋的行時不會執行。

您正在有效啓動第二個地址碼請求,然後在操作完成之前插入html


關於傳遞一個額外的參數給回調,你總是可以讓創建並返回一個函數的函數:

如。

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

然後你就可以通過在任何你想要的my_argument_value,而最裏面的代碼(...)會看到它還有兩個回調ARGS。

該函數的返回值是您傳遞給地理編碼調用的回調函數。

+0

不,最裏面的地理編碼是正確執行的,問題是讓它填充它外面的'html'變量(並且我用這種方法做這件事);但是,接下來的問題是將'results_1 [0] .address_components [i] .long_name'變量傳遞給它。 – Strae 2011-02-23 22:37:00

+0

好的 - 我編輯了答案...希望這是你要找的。 – 2011-02-24 15:57:29