2010-05-27 52 views
1

我在StackOverflow上看到很多答案,說JavaScript按順序執行代碼,但我實際上可以看到我自己的JavaScript沒有這樣做。從下面的代碼:JavaScript:應該按順序執行函數,而不是實際執行?

我得到的事件順序如下:

  1. 'centre_map' 警報
  2. 'add_markers_within_bounds' 警報
  3. 'add_marker' 警報
  4. 單獨的紅色標記出現在地圖上(即add_marker呈現)
  5. 多個藍色標記出現在地圖上(即add_markers_within_邊界呈現)

爲什麼add_markers_within_boundsadd_marker開始之前沒有完成:我該如何做到這一點?

我知道一種方法是在調用從add_markeradd_markers_within_bounds,但由於種種原因,我寧願保持其作爲一個單獨的函數。

+1

許多谷歌地圖功能執行與回調Ajax調用,所以其他的JavaScript將繼續執行(按順序),直到異步請求完成。因爲我沒有時間爲你寫一個完整的答案,對不起:-) – 2010-05-27 15:19:49

+0

另外,你正在使用Maps API v2 - 你可能想遷移到v3。它不會解決您的問題,但不使用已棄用的系統可能是個好主意。 http://code.google.com/apis/maps/documentation/javascript/basics.html – Matchu 2010-05-27 15:29:00

+0

你們都是絕對正確的。謝謝 - 我已升級到v3。通過允許您在標記上設置顯示優先級,也可以輕鬆解決問題! – AP257 2010-05-27 19:22:21

回答

2

Google Maps API有時會向Google發送請求以獲取數據。如果其中一個操作涉及到請求數據,則會延遲到HTTP請求完成,並且其餘的代碼將繼續運行,而沒有它。

在我看來,add_marker可能不涉及請求數據,因爲您已經提供了座標,而add_markers_within_bounds可能涉及下載數據以知道座標實際是什麼。因此,add_marker將始終首先發生,而其他標記的數據仍在忙於下載。

我不確定Google Maps API是如何工作的,但您可能會指定add_marker作爲add_markers_within_bounds所有數據準備就緒後的回調。

+0

事件代表團也可以使用,有一些插件可用於js事件刪除 – 2010-05-27 15:24:14

+0

代表事件是什麼? – Matchu 2010-05-27 15:25:25

+0

你當然是對的,刪除了我自己的答案 - 沒有想到通過;-) – 2010-05-27 15:26:28

0

也許在GMap2上的操作是異步的(可能與A JAX)?如果是這樣,你可能需要在通話後進行阻止操作,如果你想確定序列。

0

據我所知,你希望在執行前者後調用該函數。這可能會幫助你,但我不是100%肯定的,因爲我無法測試它的情況類似於你的情況。

window.setTimeout(function() { 
     add_marker(); 
    }, 0); 

給予0的組超時的時間迫使它在年底執行它