2012-08-13 72 views
0

是否有人可以給我解釋以下行爲:谷歌的地理編碼阿比

function getLatLong() 
    { 
     var geocoder = new google.maps.Geocoder(); 
     var result = ""; 
     geocoder.geocode ({ 'address': "London", 'region': 'uk' }, function(results, status) { 
      if (status == google.maps.GeocoderStatus.OK) { 
      result = results[0].geometry.location; 
      alert('Im called second'); 
      } else { 
       alert("Geocode was not successful for the following reason: " + status); 
      } 
     }); 

     alert('Im called first'); 
     return result; 
    } 

怎樣第二警報消息被稱爲第一警報之前?我有一個問題,我試圖返回賦值變量'result'的值,但它仍然作爲空字符串返回,即使它從result [0] .geometry.location中分配了一個值。我有一種可怕的感覺,我錯過了一些非常明顯的東西:/

回答

1

geocoder.geocode()是一種異步方法,意味着它立即返回而不會阻塞,但只有在地理編碼調用(可能是Google的地理編碼服務)已完成。

發生什麼事情是alert('Im called first')呼叫在另一個呼叫完成之前被呼叫,很可能是因爲地理編碼呼叫必須通過互聯網。這兩個調用的順序可能有所不同,完全取決於地理編碼完成的時間。

爲了解決這個問題,你不能從這個函數返回結果。相反,您需要提供一個函數,以便在地理編碼完成時充當回調函數,以便您可以使用現在填充的結果。

例如

function getLatLong(completeCallback) 
{ 
    var geocoder = new google.maps.Geocoder(); 
    geocoder.geocode ({ 'address': "London", 'region': 'uk' }, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      var result = results[0].geometry.location; 
      completeCallback(result); 
     } else { 
      alert("Geocode was not successful for the following reason: " + status); 
     } 
    }); 
} 
+0

完美。非常感謝您的明確解釋! – BIOS 2012-08-13 22:51:49

1

o原因是調用geocoder.geocode使用回調來提供結果。對geocoder.geocode的調用只能持續足夠長的時間以向地理編碼器服務發送請求,然後繼續執行下一個(非回調)行,即「Im叫第一個」警報。回調中的所有代碼都將「保存以備後用」,並在收到地理編碼器響應時調用。

您必須相應地編寫代碼。您不必從原來的函數調用中返回結果,而必須在回調中取得結果並從那裏繼續處理。它可以使JavaScript控制流程有點難以遵循。

+0

感謝您的回覆。我現在只是在第一個回調中編寫處理代碼,而且效果很好!將看起來像上面的答案所示,將回調鏈接起來以獲得清晰。 – BIOS 2012-08-13 22:52:58