我是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/