我是StackOverflow的新手:)

我需要帮助:我正在尝试制作反地理编码(从坐标获取地址)。我有一个适用于ajax的很好的URL。我有许多要转换为地址的坐标,这就是为什么我首先尝试在JSfiddle上具有4个坐标的数组上的原因。

我想要的结果是我的脚本将所有地址添加到阵列中。我正在尝试使用for循环,并在数组的每个元素上执行一个ajax调用,以查找良好的坐标。

您可以在此链接上找到调用(我将脚本放在链接之后):https://jsfiddle.net/e2wr3umy/

我的代码适用于元素:

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.js"></script>
$.ajax({

                     url: 'https://reverse.geocoder.ls.hereapi.com/6.2/reversegeocode.json',
                      type: 'GET',
                      dataType: 'jsonp',
                      jsonp: 'jsoncallback',
                      data: {
                        prox: '43.564624, 3.847154,250',
                        mode: 'retrieveAddresses',
                        maxresults: '1',
                        gen: '9',
                        apiKey: 'NOT_THE_REAL_API_KEY'
                      },
                      success: function (data) {
                        var re = JSON.stringify(data);
                        console.log(data);
                        var num = (data.Response.View[0].Result[0].Location.Address.HouseNumber);
                        var rue = (data.Response.View[0].Result[0].Location.Address.Street);
                        var ville = (data.Response.View[0].Result[0].Location.Address.City);
                        var CP = (data.Response.View[0].Result[0].Location.Address.PostalCode);
                        console.log(num, rue, CP, ville)
                      }
                    });



然后,我尝试使用4个元素的数组,这是链接:https://jsfiddle.net/L07pjwba/

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.js"></script>

var adresse = [['43.564624, 3.847154',1],['43.564624, 3.447154',27],['43.64624, 3.727154',75],['43.564624, 3.617154',254]];


for (i =0; i<adresse.length; i++) {
console.log("element", adresse[i]);
$.ajax({
                      url: 'https://reverse.geocoder.ls.hereapi.com/6.2/reversegeocode.json',
                      type: 'GET',
                      dataType: 'jsonp',
                      jsonp: 'jsoncallback',
                      data: {
                        prox: adresse[i][0].concat(', 250'),
                        mode: 'retrieveAddresses',
                        maxresults: '1',
                        gen: '9',
                        apiKey: 'NOT_THE_REAL_API_KEY'
                      },
                      success: function (data) {
                        var re = JSON.stringify(data);
                        console.log("data", data);
                        var num = (data.Response.View[0].Result[0].Location.Address.HouseNumber);
                        var rue = (data.Response.View[0].Result[0].Location.Address.Street);
                        var ville = (data.Response.View[0].Result[0].Location.Address.City);
                        var CP = (data.Response.View[0].Result[0].Location.Address.PostalCode);
                        adresse[i].push(num, rue, ville, CP);

                      }
                    });

}
console.log("adresse : ",adresse);



但是结果却不是我所期望的:看起来ajax调用在for循环结束之后开始,即使它在for循环中也是如此。我尝试在Ajax中使用async: false,但是它没有任何改变。

最佳答案

这是由于不了解异步而引起的常见问题。 Here是解决异步问题的规范资源,但我认为它不能解决您的所有问题,因此我不会将其标记为重复,但请仔细阅读。

基本上,您的代码告诉地理编码服务让您知道地址。然后您打印数组。将来的某个时候,地理编码服务会回答您,但数组已被打印,并且JavaScript没有时间机器。

基本原则是,除了在该函数(或其承诺链)的回调以及从那里调用的函数的回调中,您永远不能在任何地方使用从异步函数获得的值。在第一个代码段中,您可以正确执行此操作:在回调中使用console.log。在第二个片段中,将其移到回调之外,这就是问题的根源。

这是正确书写的方法。 $.ajax返回一个“承诺”,您可以使用.then将其链接起来,以指定在兑现承诺后(即您从地址解析服务获得响应)应执行的操作。您可以使用Promise.all等待数组中的所有promise都得到履行。总体而言,它应该看起来像这样(我更改了最少的代码,但编写方式有所不同):

var adresse = [
  ['43.564624, 3.847154', 1],
  ['43.564624, 3.447154', 27],
  ['43.64624, 3.727154', 75],
  ['43.564624, 3.617154', 254]
];

var promises = [];
for (i = 0; i < adresse.length; i++) {
  console.log("element", adresse[i]);
  var promise = $.ajax({
    url: 'https://reverse.geocoder.ls.hereapi.com/6.2/reversegeocode.json',
    type: 'GET',
    dataType: 'jsonp',
    jsonp: 'jsoncallback',
    data: {
      prox: adresse[i][0].concat(', 250'),
      mode: 'retrieveAddresses',
      maxresults: '1',
      gen: '9',
      apiKey: 'NOT_THE_REAL_API_KEY'
    },
  }).then(function(data) {
    var num = (data.Response.View[0].Result[0].Location.Address.HouseNumber);
    var rue = (data.Response.View[0].Result[0].Location.Address.Street);
    var ville = (data.Response.View[0].Result[0].Location.Address.City);
    var CP = (data.Response.View[0].Result[0].Location.Address.PostalCode);
    adresse[i].push(num, rue, ville, CP);
  });
  promises.push(promise);
}

Promise.all(promises).then(function() {
  console.log("adresse : ", adresse);
});

关于javascript - for循环中AJAX的问题:如何在数组的每个元素上进行Ajax调用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60430489/

10-11 20:11
查看更多