2011-04-26 133 views
0

嗨,我與谷歌地圖API 工作,我有這個巨大的代碼,所以我不想嚇跑人的代碼 基本上這就是我需要做的返回值映射回調函數

我有一個javascript(1)函數,我從Html打電話後,有人點擊一個按鈕, 從這個函數我做了一些處理來計算緯度和經度,並調用一個自定義函數,使用緯度和經度,並調用谷歌地圖功能。我需要通過從谷歌地圖的價值回撥功能回到javascript函數(1)

這裏是怎麼一回事呢

--------------文件First.html ----------------

<script type="text/javascript" src="functions.js"></script> 
<script type="text/javascript"> 
function docalculation 
{ 
    .....some calculations for latlng...... 
    var value = get_value(latlng); 
} 
</script> 
<html> 
    .....html file.... 
    <input type="button" value="Create Directions" onClick="docalculation()"> 
</html> 

------------------- file functions.js- ---------------

var return_val; 
function get_val(latlng) 
{ 
    geocoder = new google.maps.Geocoder(); 
    geocoder.geocode({'latLng': latlng}, function(results, status) { 

    return_val = (results[0].address_components[i].long_name); 
    alert(return_val); //here I get the value that I need in alert 
    } 

alert (return_val); // here the value suddenly becomes undefined 
return val; // hence returns undefined 
} 

請幫助我卡在這裏,即使經過兩天的谷歌搜索和嘗試,仍然找不到解決方案克我所知道的一切。

任何幫助讚賞感謝

,我正在尋找最簡單的解決辦法是一些方法來RETURN_VAL的值保存到變量值

感謝

+0

聽起來像一個變量範圍的問題,但沒有參考的全畫幅這將是一個有點難以揣摩出它會出軌。 – Femi 2011-04-26 22:16:46

+0

有什麼方法可以存儲這個值(return_val).....我需要解決方案拼命 – koool 2011-04-26 23:13:29

回答

3

這是因爲geocode()是異步的:它返回立即但響應到達後立即調用回調函數。你需要接受一個回調get_val()和價值傳遞給此方法,而不是試圖返回它(這是不可能的):

function get_val(latlng, cb) { 
    geocoder = new google.maps.Geocoder(); 
    geocoder.geocode({ 
     'latLng': latlng 
    }, function (results, status) { 
     cb(results[0].address_components[i].long_name); 
    }); 
} 

用法:

get_value(latlng, function(longName) { 
    /* do something */ 
}); 
+0

+1 - 打我吧:-) – 2011-04-26 22:18:10

+1

我敢打賭,有關返回值和異步函數的問題是最重要的這裏常見的JavaScript問題 – 2011-04-26 22:22:47

+0

感謝您的回覆,但還有一個問題我將面臨使用這個解決方案........ 函數返回的是路的名字...... 我需要做的是將第一個值存儲在變量say first road中,並將第二個值存儲在變量say second road中,並比較變量first和road,看看它們是否具有相同的值,並且我需要在循環幾次....感謝您的快速回復,雖然... – koool 2011-04-26 22:28:59

1

這裏是你如何可以使用ThiefMaster的答案在一次通話中獲得多個經度。不是因爲心靈的隱隱。

/** 
* @param {string[]} values longitude strings 
* @param cb {function} The callback that will be passed a 
*  map keyed by latlng strings where each value 
*  is the long name of the street 
*/ 
function getLongNames(values, cb) { 
    var returnValues = {}; 
    var responseCount = 0; 
    var geocoder = new google.maps.Geocoder(); 

    for (var i =0; i < values.length; i++) { 
     getSingleName(values[i], function(latLng, longName) { 
      returnValues[latLng] = longName; 
      responseCount++; 
      if (responseCount == values.length) { 
       cb(returnValues); 
      } 
     }); 
    } 

    function getSingleName(latlng, cb) { 
     geocoder.geocode({ 
      'latLng': latlng 
     }, function (results, status) { 
      cb(latlng, results[0].address_components[i].long_name); 
     }); 
    } 
} 

你這樣稱呼它

// The callback is the code that is run once all the latLng have been processed 
getLongNames(["latLng1", "latLng2","latLng2"], function (valueMap) { 
    for (var latLng in valueMap) { 
    console.log("Latitude Longitude:" + latLng + " Long Name " + valueMap[latLng]); 
    } 
}); 
+0

HI胡安感謝您的回覆....您的代碼可以幫助我比較兩個道路的功能,但是,在比較它們之後,我需要傳遞一個布爾值來確定值是否匹配,而我不要以爲我們可以在使用此代碼後實現這一目標.......... – koool 2011-04-26 23:26:37

+0

@Nick:我不明白你的意思,你在返回的地圖中擁有所有的值,它是什麼,你不能 – 2011-04-26 23:29:02

+0

@Juam Mendes:根據我最簡單的解決方案,我正在尋找這個問題是提取變量return_val的值的一些方法,我在原代碼,並將其存儲在某個變量中的docalculation函數中(原始問題)......無論如何,我可以實現這一點......我真的很感謝你的努力....請幫助我邪惡的問題,如果你可以感謝 – koool 2011-04-26 23:29:52