Я вспомнил, что у меня была похожая проблема, но она была другой природы, однако структура проблемы была такой же.
Мне пришлось дважды щелкнуть по нему, чтобы оно заработало. Я наконец понял это, и вот код, Мой Оригинальный пост на Google 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» - «Выполнить как поток», а затем «Второе» - также «поток». следовательно, значение по-прежнему равно нулю. Поэтому вам нужно как-то заставить gdirection подождать, пока первое и второе вернёт свое значение
Примечание: два callBacks в приведенном выше коде
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);
}
Способ, которым я решил, состоял в том, чтобы поместить его в функцию обратного вызова. Функция обратного вызова вызывается, когда процесс завершается
Итак, вот шаги
- Получите первое местоположение (Нью-Йорк)
- После того, как вы получите первое местоположение (NY) Получите второе местоположение (CA), запустив функцию поиска внутри обратного вызова первого местоположения
- И, наконец, отобразите эти 2, которые у вас, кажется, хорошо работают, но единственное отличие состоит в том, что вы отображаете их в обратном вызове второй функции
Если вы все еще не понимаете концепцию, дайте мне знать .. я отредактирую ее и разделю еще немного, чтобы вы могли понять, но это должно решить вашу проблему