带有多个标记的Google Maps javascript=>;标签文本在循环中处处相同

带有多个标记的Google Maps javascript=>;标签文本在循环中处处相同,javascript,google-maps,asynchronous,google-maps-api-3,closures,Javascript,Google Maps,Asynchronous,Google Maps Api 3,Closures,下面的代码是完美的工作,除了标记标签文本。。。数组包含实际地址和加载顺序号。标记已正确放置在地图上,但所有标签文本均显示“3”,而不是1、2、3。。。如何解决这个问题 <div id='track_trace_map'></div> <script> function track_trace_map() { var truck_last_position_lat = '44.1747', var truck_last_position

下面的代码是完美的工作,除了标记标签文本。。。数组包含实际地址和加载顺序号。标记已正确放置在地图上,但所有标签文本均显示“3”,而不是1、2、3。。。如何解决这个问题

<div id='track_trace_map'></div>

<script>
    function track_trace_map() {
    var truck_last_position_lat = '44.1747',
    var truck_last_position_long = '1.6117',
        var map = new google.maps.Map(document.getElementById('track_trace_map'), {      
            center: {
                lat: truck_last_position_lat,
                lng: truck_last_position_long
            },
            zoom: 6
        });
        var marker = new google.maps.Marker({
            animation: google.maps.Animation.DROP,
            map: map,
            position: {
                lat: truck_last_position_lat,
                lng: truck_last_position_long
            },
        });
        var track_trace_collections = [["DIGUE DE LA CARTONNERIE+82200+MOISSAC",1],["ZI DES PRADES+12110+VIVIEZ",2],["AVENUE GUSTAVE EIFFEL 1+41200+ROMORANTIN LANTHENAY",3]];
        for (var x = 0; x < track_trace_collections.length; x++) {
                $.getJSON('https://maps.googleapis.com/maps/api/geocode/json?key=KEYHIDDEN&callback&address='+track_trace_collections[x][0]+'&sensor=false', null, function (data) {
                    var p = data.results[0].geometry.location
                    var latlng = new google.maps.LatLng(p.lat, p.lng);
                    new google.maps.Marker({
                        animation: google.maps.Animation.DROP,
                        label: {
                            color: 'white',
                            fontWeight: 'bold',
                            text: String(track_trace_collections[x][1])
                        },
                        map: map,
                        position: latlng
                    });
                });
        }
    }
</script>
<script async defer src="https://maps.googleapis.com/maps/api/js?key=KEYHIDDEN&language=en&callback=track_trace_map"></script>

函数跟踪\跟踪\映射(){
变量卡车最后位置横向='44.1747',
变量卡车最后位置长='1.6117',
var map=new google.maps.map(document.getElementById('track\u trace\u map'),{
中心:{
横向:卡车、最后位置、横向,
液化天然气:卡车最后位置长
},
缩放:6
});
var marker=new google.maps.marker({
动画:google.maps.animation.DROP,
地图:地图,
职位:{
横向:卡车、最后位置、横向,
液化天然气:卡车最后位置长
},
});
var track_trace_collections=[“卡通内里大街+82200+莫瓦萨克街”,1],“普拉德斯广场+12110+维维兹街”,2],“古斯塔夫埃菲尔大道1+41200+罗莫兰蒂大街”,3];
对于(var x=0;x
这是因为您正在循环中运行异步操作
getJSON
在其回调函数运行之前需要花费时间去服务器并接收响应,而在请求解析时,您的循环已经运行了,并且
x
是3

在允许循环继续运行之前,您需要定义一个异步函数并等待请求完成。比如:

var track_trace_collections = [["DIGUE DE LA CARTONNERIE+82200+MOISSAC",1],["ZI DES PRADES+12110+VIVIEZ",2],["AVENUE GUSTAVE EIFFEL 1+41200+ROMORANTIN LANTHENAY",3]];

const asyncLoop = async () => {
  for (var x = 0; x < track_trace_collections.length; x++) {
     const data = await $.getJSON('https://maps.googleapis.com/maps/api/geocode/json?key=KEYHIDDEN&callback&address='+track_trace_collections[x][0]+'&sensor=false');
     var p = data.results[0].geometry.location
     var latlng = new google.maps.LatLng(p.lat, p.lng);
     new google.maps.Marker({
         animation: google.maps.Animation.DROP,
         label: {
              color: 'white',
              fontWeight: 'bold',
              text: String(track_trace_collections[x][1])
              },
              map: map,
              position: latlng
                });
        }
}
asyncLoop();

var track\u trace\u collections=[“卡通尼街+82200+莫瓦萨克”,1],“普拉德斯广场+12110+维维兹”,2],“古斯塔夫埃菲尔大道1+41200+罗摩兰特内”,3];
const asyncLoop=async()=>{
对于(var x=0;x
应该有用。

,如您所见

您可以使用
let
for
循环中限制标签值的范围,允许传递给
$.getJSON
的匿名函数在适当的范围内关闭,稍后调用时使用正确的标签值

例如:

var track_trace_collections = [["DIGUE DE LA CARTONNERIE+82200+MOISSAC",1],["ZI DES PRADES+12110+VIVIEZ",2],["AVENUE GUSTAVE EIFFEL 1+41200+ROMORANTIN LANTHENAY",3]];

// need to use let to properly scope loop control variable
// so it goes out of scope when loop completes
for (let x = 0; x < track_trace_collections.length; x++) {

    // use let to limit scoping to inside the for loop
    // then anonymous function passed to $.getJSON will close over proper value
    // this may not be necessary if 'x' is properly scoped using let
    let trackTraceLabel = String(track_trace_collections[x][1]);

    $.getJSON('https://maps.googleapis.com/maps/api/geocode/json?key=KEYHIDDEN&callback&address='+track_trace_collections[x][0]+'&sensor=false', null, function (data) {
        var p = data.results[0].geometry.location
        var latlng = new google.maps.LatLng(p.lat, p.lng);
        new google.maps.Marker({
            animation: google.maps.Animation.DROP,
            label: {
                color: 'white',
                fontWeight: 'bold',
                text: trackTraceLabel
            },
            map: map,
            position: latlng
        });
    });
}
var track\u trace\u collections=[“卡通尼街+82200+莫瓦萨克”,1],“普拉德斯广场+12110+维维兹”,2],“古斯塔夫埃菲尔大道1+41200+罗摩兰特内”,3];
//需要使用let来正确定义循环控制变量的范围
//所以当循环完成时,它就超出了范围
对于(设x=0;x
如果允许匿名函数在适当范围内关闭,则无需暂停异步函数执行以等待
承诺
解决。虽然这个答案可能有效,但它不必要地序列化了并行操作。