2009-08-07 107 views
1

我與Google Maps API存在兩難境地 - 我使用GDirections對象來獲得在兩點之間旅行所需的時間。Google Maps API - GDirections.getDuration()第一次返回null,第二次返回

我已經在Firebug中測試了下面的代碼,以便我影響這一個調用的其他代碼的機會很低(我無法鏈接到實際的地圖;它在本地計算機上)。

var start = "NY, USA"; 
var end = "CA, USA"; 
var searchString = "from: " + start + " to: " + end; 

C.console(searchString); 

var myDir = new GDirections(); 

GEvent.addListener(myDir,"load",C.console(myDir,getDuration())); 
myDir.load(searchString); 

C.console就是我寫的打印它的參數Firebug的調試日誌的功能。當我運行該代碼時,它輸出searchString from: NY, USA to: CA, USA並調用回調函數。但是,它輸出null而不是GDirections對象的持續時間。

接着,我運行

C.console(myDir.getDuration()) 

並根據需要它。OUPUTS

Object seconds=157994 html=1 day 20 hours 

。有誰知道爲什麼這需要兩個電話才能工作?我認爲這是時間依賴性的,因爲在代碼中,如果我只是簡單地調用它兩次,它會連續給我兩次,這並不令人驚訝。不過,我已經使用事件偵聽器來等待它完成加載。我也嘗試使用addoverlay事件而不是load事件,但這也不起作用。

有沒有人見過這個或有想法,我怎麼能解決它?任何幫助將不勝感激!

回答

0

這真讓我非常震撼。我打的代碼,這個工程:

var start = "NY, USA"; 
var end = "CA, USA"; 
var searchString = "from: " + start + " to: " + end; 

C.console(searchString); 

var directions = new GDirections(); 
GEvent.addListener(directions,"load",function() { 
    C.console(directions.getDuration()); 
}); 

directions.load(searchString); 

除了一個變量的變化(myDir現在directions),我用了一個匿名函數爲回調函數。看起來這是一個範圍問題,也許是第二次通過變量定義,所以它不再是null。無論如何,這似乎現在正常工作 - 我希望這也可以幫助其他人。

0

我記得我有一個類似的問題,但它是不同的性質,但問題結構是相同的。我不得不點擊它兩次才能正常工作。我終於想通了,這裏是代碼,我在谷歌API(http://groups.google.com/group/Google-AJAX-Search-API/browse_thread/thread/c6c46cc8a0435eb0/f697b028bbce18db#f697b028bbce18db

<script type='text/javascript'> 
google.load('search', '1'); 
google.load('maps', '2'); 

//Define our Globals 
var map;      //Map API 
var gdir;      //Direction API 
var gFirstSearch;  //The From Local Search 
var gSecondSearch;  //The To Local Search 

var fromAddress;  //From Address The user inputs 
var toAddress;   //To Address the user inputs 

var first;      //First Set of Results for From Search 
var second;    //Second Set of Results for To Search 

//On Load, Load all the Details Needed 
function OnLoad(){ 

     //Set up the Map and the Globals 
     //If the Browser Supports its 
     if (GBrowserIsCompatible()) { 
       map = new GMap2(document.getElementById("map")); 
       map.setCenter(new GLatLng(52.037366,-0.703726), 7); 
       map.removeMapType(G_HYBRID_MAP); 

       var mapControl = new GMapTypeControl(); 
       map.addControl(mapControl); 
       map.addControl(new GLargeMapControl()); 

       gdir = new GDirections(map); 
       GEvent.addListener(gdir, "load", onGDirectionsLoad); 
       GEvent.addListener(gdir, "error", handleErrors); 

       gFirstSearch = new google.search.LocalSearch(); 
       gFirstSearch.setCenterPoint(map); 
       gFirstSearch.setSearchCompleteCallback(null, FirstSearch); 

       gSecondSearch = new google.search.LocalSearch(); 
       gSecondSearch.setCenterPoint(map); 
       gSecondSearch.setSearchCompleteCallback(null, SecondSearch); 
     } 

} 

//Run the From Search 
//Runs after the gFirstSearch.execute has finished 
//Reference: setSearchCompleteCallback 
function FirstSearch(){ 

     if (!gFirstSearch.results.length){ alert("Could Not Find: " + 
fromAddress + "\n Please Try Refining your 'From' Address Field"); 
return; } 
     //Return the First Result into a Variable 
     first = gFirstSearch.results[0]; 

     //Execute the Second 
     gSecondSearch.execute(toAddress); 

} 

//Run the To Search 
//Runs after the gSecondSearch.execute has finished 
//Reference: setSearchCompleteCallback 
function SecondSearch(){ 

     if (!gSecondSearch.results.length){ alert("Could Not Find: " + 
toAddress + "\n Please Try Refining your 'To' Address Field"); 
return; } 

     //Returns the Second results into a Variable 
     second = gSecondSearch.results[0]; 

     //Plot our Graph 
     gdir.load("from: " + (first.lat + ", " + first.lng) + " to: " + 
(second.lat + ", " + second.lng)); 

} 

//Use to Execite our Form Commands 
function setDirections(ifromAddress, itoAddress) { 

     //Initiate the inputs into our Global Variables 
     fromAddress = ifromAddress; 
     toAddress = itoAddress; 

     //Execute our Search 
     gFirstSearch.execute(fromAddress); 

     //Return False so our broweser dosent Refresh 
     return false; 

} 

//Set the Values in our HTML after Direction has loaded 
function onGDirectionsLoad(){ 

     var miles = gdir.getDistance().meters * 0.000621371192; //Convert to 
Miles 
     document.getElementById("distance").innerHTML = "Distance: " + miles 
+ " ml"; 

     // and yada yada yada... 
} 

</script> 

原貼通過看這個我記得第一個GET方向運行的線程,然後第二個是也作爲一個線程運行,那麼爲什麼它需要2次點擊是因爲當你做gdirection時第二個沒有加載hense值仍然爲空。因此,你需要一些怎麼也得讓gdirection等到第一和第二返回其值

注:在上面的代碼中的兩個回調

gFirstSearch.setSearchCompleteCallback(null, FirstSearch); 
gSecondSearch.setSearchCompleteCallback(null, SecondSearch); 

注:此功能gSecondSearch.execute(的toAddress)正在運行裏面的函數firstSearch()

//Run the From Search 
//Runs after the gFirstSearch.execute has finished 
//Reference: setSearchCompleteCallback 
function FirstSearch(){ 

    if (!gFirstSearch.results.length){ 
     alert("Could Not Find: " + fromAddress); 
     return; 
    } 

    //Return the First Result into a Variable 
    first = gFirstSearch.results[0]; 

    //Execute the Second 
    gSecondSearch.execute(toAddress); 

} 

我解決它的方式是把它放到回調函數中。當過程結束

所以這裏的回調函數被調用的步驟是

  1. 得到第一個位置(紐約州​​)
  2. 後你得到的第一個位置(NY)獲取第二位置(CA )通過在第一個位置的回調內查找功能
  3. 而finaly地圖這些2,你似乎做OK了那裏,但唯一不同的是,你在第二個函數的回調映射它

如果你仍然迷失在這個概念上,讓我知道。il編輯它並將它分開多一點,這樣你就可以理解,但它應該可以解決你的問題

+0

我很欣賞的響應 - 它似乎並不像我的問題是相同的,但。我只有一個過程,獲取方向 - 我認爲GDirections對象可以查詢「從:NY,USA到:CA,USA」,並且能夠獲取方向。這些位置已經被找到並且保存在先前的功能中 - 一個是用戶輸入的,另一個是反向地理編碼的。 – munchybunch 2009-08-07 21:29:43

+0

:D很好,你修正了它..但我想只是當你在這個API上運行兩個函數時小心,導致它線程的所有功能和煩人,當你想要順序執行的事情:D – 2009-08-07 22:48:24

2

你的問題是,這條線

GEvent.addListener(myDir,"load",C.console(myDir,getDuration())); 

導致C.console必須立即執行的,不管它返回將被用作回調函數。這不是你想要的。你想要的是C.console在回調發生時被調用。要做到這一點的方法之一是

GEvent.addListener(myDir,"load",function() { 
    C.console(myDir,getDuration()) 
}); 
0

如何使用GDirections對象?

 var dir=new GDirections(map); 
var queryString="from: "+ map.getCenter()+"to: "+marker.getLatLng(); 
dir.load(queryString); 
alert(dir.getDistance().meters); 

錯誤:dir.getDistance()沒有被定義....

相關問題