2

我的地图上有一个标记,代表国际空间站的当前位置(来自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/

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

谢谢!

4

2 回答 2

9

您应该将整个 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();

演示

注意:最好setTimeout与 Ajax 调用一起使用,因为您不知道需要多长时间才能获得响应。

于 2013-01-22T20:01:44.120 回答
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();

你可能会走得更远......如果请求花费的时间超过一秒钟,例如如果您的请求花费的时间超过一秒钟,则会出现一些口吃。但是,如果该请求花费的时间更长,那么您可能还有其他需要处理的问题。

于 2013-01-22T23:36:18.603 回答