2010-06-07 80 views
26

我正在使用google maps API,只要我將變量返回給codeLatLng函數的初始化函數,它聲明未定義。如果我從codeLatLng打印變量,它顯示正常。如何從Google Maps JavaScript geocoder回調中返回變量?

var geocoder; 
    function initialize() { 
    geocoder = new google.maps.Geocoder(); 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    var addr = codeLatLng(); 
    document.write(addr); 

    } 

    function codeLatLng() { 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    if (geocoder) { 
     geocoder.geocode({'latLng': latlng}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      if (results[1]) { 
       return results[1].formatted_address; 
      } else { 
      alert("No results found"); 
      } 
     } else { 
      alert("Geocoder failed due to: " + status); 
     } 
     }); 
    } 
    } 

打印出不確定

如果我做的:

var geocoder; 
    function initialize() { 
    geocoder = new google.maps.Geocoder(); 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    codeLatLng(); 


    } 

    function codeLatLng() { 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    if (geocoder) { 
     geocoder.geocode({'latLng': latlng}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      if (results[1]) { 
       document.write(results[1].formatted_address); 
      } else { 
      alert("No results found"); 
      } 
     } else { 
      alert("Geocoder failed due to: " + status); 
     } 
     }); 
    } 
    } 

打印出紐約,NY 10012,USA

回答

44

您不能返回從函數的值,該值還不時存在函數返回。

geocode方法使一個asynchonous通話,並使用一個回調來處理結果,所以你必須做同樣的codeLatLng功能:

var geocoder; 
function initialize() { 
    geocoder = new google.maps.Geocoder(); 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    codeLatLng(function(addr){ 
    alert(addr); 
    }); 
} 

function codeLatLng(callback) { 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    if (geocoder) { 
    geocoder.geocode({'latLng': latlng}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
     if (results[1]) { 
      callback(results[1].formatted_address); 
     } else { 
      alert("No results found"); 
     } 
     } else { 
     alert("Geocoder failed due to: " + status); 
     } 
    }); 
    } 
} 
+0

是嗎?可能返回addr的值?我應該如何將addr分配給變量? – AbtPst 2016-02-17 22:32:19

+0

@AbtPst:在異步調用中不能返回任何結果,因爲調用在返回結果之前返回。我在哪裏放置了alert(addr);'是你可以使用結果的地方。可以將值分配給全局變量,但是您仍然需要等待該值到達。對, – Guffa 2016-02-18 00:33:07

+0

是的,沒關係。實際上我有一個拉特朗數值的數組。我想迭代地處理數組並不斷地將地址添加到列表中。順便說一下,有沒有辦法一次性反轉地理編碼的緯度值數組?以及如何將addr分配給全局變量?我可以只在函數內執行x = addr嗎? – AbtPst 2016-02-18 00:39:18

-2

這回不是從codeLatLng返回;它從傳遞給geocoder.geocode的匿名函數返回。

我想你需要使用其他機制來傳遞數據,例如一個全局變量

0

將geocoder作爲參數傳遞給codeLatLng()函數。

function codeLatLng(geocoder) { 

調用它像這樣在你的初始化函數:

var addr = codeLatLng(geocoder); 
11

你正在做一個異步請求,你codeLatLng()功能已完成,地理編碼完成之前返回長。

如果您需要的地理編碼數據繼續,你就得鏈的功能整合在一起:

function initialize() { 
    geocoder = new google.maps.Geocoder(); 
    codeLatLng(); 
} 
function codeLatLng() { 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    if (geocoder) { 
     geocoder.geocode({'latLng': latlng}, function(results, status) { 
      if (status == google.maps.GeocoderStatus.OK) { 
        if (results[1]) { 
         initContinued(results[1].formatted_address); 
        } else { 
         alert("No results found"); 
        } 
       } else { 
        alert("Geocoder failed due to: " + status); 
       } 
     }); 
     } 

} 
function initContinued(addr) { 
    alert(addr); 
} 
1

geocode函數使用回調(function(results, status) { ... }),這是當geocode函數完成其工作時被調用。因此,當您從此回調中返回一個值時,它只會將其返回到geocode函數,而不是codeLatLng之外。

有了這個,你有幾種選擇:在codeLatLng定義一個變量,並將其設置在回調函數,例如:

function codeLatLng() 
{ 
    var returnValue; 
    geocoder.geocode({'latLng': latlng}, function(results, status) { returnValue = results[1].formatted_address }); 
    return returnValue; 
} 

或者你直接需要的結果在回調函數的東西。或者把結果放到一個全局變量中。 (此外,如果geocode函數是異步的 - 如果它立即返回並且之後調用回調,則需要執行後兩項中的一項,在這種情況下,不能返回codeLatLng中的值。)

+1

你的代碼示例不起作用。當變量返回時,它的值沒有被設置,這在稍後的回調函數中會發生。使用全局變量可以返回值,但問題在於,當變量中的值可用時,代碼不會得到任何信號。該函數被調用後,該值不可立即使用。 – Guffa 2010-06-08 05:41:53

+0

這就是爲什麼我說,如果地理編碼是異步的(我不知道它是否是),他應該使用其他兩種方法,全局變量或做回調中的東西。雖然我承認我沒有指出全球變數他不會得到任何信號,所以他必須定期檢查它。 – 2010-06-08 10:15:04

相關問題