2013-01-22 76 views
2

我的地圖上有一個標記,代表國際空間站的當前位置(從http://open-notify-api.herokuapp.com/iss-now.json?callback=開始?)。我也試圖讓它每1秒鐘跟着臺站的軌道一起移動。使用JSON更新傳單標記位置每x秒

這是我現在的代碼:

$.getJSON('http://open-notify-api.herokuapp.com/iss-now.json?callback=?', function(data) {     
       var latitude = data["data"]["iss_position"]["latitude"]; 
       var longitude = data["data"]["iss_position"]["longitude"]; 
       var iss = L.marker([latitude,longitude]).bindPopup("I am the ISS").addTo(map); 
       $(function() { 
       setInterval(function() { 
        iss.setLatLng([latitude,longitude]).update(); 
       },1000); 
       }); 
       }); 

這裏的一切都在的jsfiddle:http://jsfiddle.net/zmkqu/

看來放置在負載正確的位置標記,但並不每秒更新一次的它應該是。關於我在做什麼的任何提示都是錯誤的?

謝謝!

回答

7

您應該將整個Ajax調用放在setInterval回調中。現在,您將標記設置在相同的位置,因爲data不會更改。你必須做一個新的呼叫每秒:

var iss; 

function update_position() { 
    $.getJSON('http://open-notify-api.herokuapp.com/iss-now.json?callback=?', function(data) { 
     var latitude = data["iss_position"]["latitude"]; 
     var longitude = data["iss_position"]["longitude"]; 
     if (!iss) { 
      iss = L.marker([latitude,longitude]).bindPopup("I am the ISS").addTo(map); 
     } 
     iss.setLatLng([latitude,longitude]).update(); 
     setTimeout(update_position, 1000); 
    }); 
} 

update_position(); 

DEMO

注:這是更好地使用setTimeout連同Ajax調用,因爲你不知道需要多長時間獲得響應。

+0

啊,這樣做更有意義(而且效果很好)!感謝您的幫助,菲利克斯。 – Febrium

+0

不客氣:)不要忘記通過點擊旁邊的勾號將答案標記爲已接受(儘快)。它將問題標記爲已回答(併爲您提供聲望點)。如果他們的回答對你有幫助,你也應該回答你的舊問題。 –

+0

這似乎沒有工作了。 $ getJSON有什麼改變嗎? – snowgage

0

如果您需要保證它每秒更新一次,您可能需要修改這一點...現在它在服務器響應json之後觸發1秒,這很可能不是自上次更新以來的1秒。

你需要的是更多的東西是這樣的:

var iss 
    , timeElapsed = 0; 

function update_position() { 
    elapsedTime = new Date().getMilliseconds(); 

    $.getJSON('http://open-notify-api.herokuapp.com/iss-now.json?callback=?', function(data) { 
     var latitude = data["data"]["iss_position"]["latitude"]; 
     var longitude = data["data"]["iss_position"]["longitude"]; 

     elapsedTime = new Date().getMilliseconds() - elapsedTime; 

     if (!iss) { 
      iss = L.marker([latitude,longitude]).bindPopup("I am the ISS").addTo(map); 
     } 
     iss.setLatLng([latitude,longitude]).update(); 
     setTimeout(update_position, 1000 - elapsedTime); 
    }); 
} 

update_position(); 

你也許可以去即使有這樣的更遠......會有一些口吃如果請求需要更多再進行第二次例如,如果您的請求需要再長一秒。但如果這個請求花費的時間更長,那麼您可能還有其他問題需要處理。