使用JSON每隔x秒更新传单标记位置

时间:2013-01-22 19:54:28

标签: javascript leaflet

我的地图上有一个标记,代表国际空间站的当前位置(从http://open-notify-api.herokuapp.com/iss-now.json?callback=拉出来?)。我也试图让它每1秒移动一次跟随该站的轨道。

这是我现在的代码:

$.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/

似乎在加载时将标记放在正确的位置,但不会每秒更新一次。关于我做错了什么的提示?

谢谢!

2 个答案:

答案 0 :(得分:8)

您应该将整个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调用一起使用,因为您不知道获取响应需要多长时间。

答案 1 :(得分: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();

如果请求需要的时间超过一秒,如果请求需要的时间超过一秒,那么你可能会更进一步。但是,如果该请求花费的时间更长,那么您可能还需要处理其他问题。