我的地图上有一个标记,代表国际空间站的当前位置(从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/
似乎在加载时将标记放在正确的位置,但不会每秒更新一次。关于我做错了什么的提示?
谢谢!
答案 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();
注意:最好将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();
如果请求需要的时间超过一秒,如果请求需要的时间超过一秒,那么你可能会更进一步。但是,如果该请求花费的时间更长,那么您可能还需要处理其他问题。