javascript - Google Maps setTimeout() 不适用于 AJAX 调用
问题描述
我正在构建一个基于视口边界在地图上放置标记的 Web 应用程序。当用户移动地图时,标记按预期下降,但它们同时下降,我希望它们连续下降。
为了解决这个问题,我正在尝试使用window.setTimeout()
(根据 Google Maps API docs),但我无法使其与通过 AJAX 调用添加到 Set 的数据一起工作。
我不太清楚如何在我的 JS 代码中构造 window.setTimeout() 函数,这比 Google 的示例更复杂。我已经尝试了几十种不同的变体,但都没有成功。
这是JavaScript:
var markers = new Set();
var marker, i;
[...]
google.maps.event.addListener(map, "bounds_changed", () => {
var lat0 = map.getBounds().getNorthEast().lat();
var lng0 = map.getBounds().getNorthEast().lng();
var lat1 = map.getBounds().getSouthWest().lat();
var lng1 = map.getBounds().getSouthWest().lng();
$.ajax({
type: 'GET',
url: '/electra/marker_info/',
data: {
'neLat': parseFloat(lat0),
'neLng': parseFloat(lng0),
'swLat': parseFloat(lat1),
'swLng': parseFloat(lng1)
},
success: function (data) {
add_markers(data, i * 200);
}
});
});
[...]
function add_markers(ajaxData, timeout) {
window.setTimeout(() => {
for (i = 0; i < ajaxData.length; i++) { //puts markers in the markers set
if(! markers.has(JSON.stringify(ajaxData[i]))) {
marker = new google.maps.Marker({
position: new google.maps.LatLng(ajaxData[i][2], ajaxData[i][3]),
map: map,
animation: google.maps.Animation.DROP,
})
[...]
markers.add(JSON.stringify(ajaxData[i]));
}
}
}, timeout);
}
解决方案
我会add_markers
以这种方式更改您的功能:
function add_markers(ajaxData, timeout) {
for (let i = 0; i < ajaxData.length; i++) { //puts markers in the markers set
if(! markers.has(JSON.stringify(ajaxData[i]))) {
let marker = new google.maps.Marker({
position: new google.maps.LatLng(ajaxData[i][2], ajaxData[i][3]),
map: map,
animation: google.maps.Animation.DROP,
})
[...]
// here you increase the delay based on current number or markers
addMarker(JSON.stringify(ajaxData[i]), timeout * markers.size);
}
}
并定义一个新函数以在所需时间插入标记:
function addMarker(marker, interval) {
setTimeout(function() { markers.add(marker); }, interval);
}
基本上,您setTimeout
从处理您从 Ajax 调用获得的数据的函数中移至负责实际插入标记的函数。下面的行将确保立即插入第一个标记(marker.size
为 0);下一个将插入timeout
彼此相距一段距离。
addMarker(JSON.stringify(ajaxData[i]), timeout * markers.size);
推荐阅读
- python - 使用 GINI INDEX 手动构建决策树
- javascript - 获取对象而不是布尔值
- java - 当 arraylist.size > 1 布局消失并且数组可见时尝试设置条件,反之亦然
- c++ - 有没有办法在编译时对类型 ID 进行排序?
- javascript - 加载时按列对 HTML 表进行排序
- r - 在不使用 colnames() 的情况下更改 R 中矩阵的列名
- react-native - Reanimated 中的错误“试图从不同的线程同步调用函数 res”
- javascript - HTML 元素 (tr &td) 显示在客户端
- python - 疯狂的输出数字 - python 中的 Dijkstra 算法 - 找到最短路径
- java - 将war文件部署到webapps后,Java项目没有从tomcat管理器在tomcat服务器上运行?