所以,我正在解析信息并查询具有多个地址的地理编码。我不完全确定这样做的最佳方式是什么。所以这就是我想要做的。
for($j = 0; $j < $rawArray.length; $j++){
$baseStr = $addresNum != 'empty' ? $rawArray[$j][$addresNum] + ' ': '';
$baseStr += $addresStr != 'empty' ? $rawArray[$j][$addresStr] + ' ': '';
$baseStr += $addresDiv != 'empty' ? ', ' + $rawArray[$j][$addresDiv] : '';
$baseStr = ($baseStr.toLowerCase().indexOf("qc") >= 0 || $baseStr.toLowerCase().match(/qu[e-é]bec/) ? $baseStr : $baseStr + ", Qc");
console.log("Looking for: " + $baseStr.match(/\w\d\w([ ])*\d\w\d/i)[0]);
$baseStr = $baseStr.match(/\w\d\w([ ])*\d\w\d/i)[0];
$geocoder.geocode({
address: $baseStr
}, function(locResult, status) {
$arrayCoords[$j] = new Array();
if (status == google.maps.GeocoderStatus.OK) {
$arrayCoords[$j][0] = locResult[0].geometry.location.lat();
$arrayCoords[$j][1] = locResult[0].geometry.location.lng();
}else {
$arrayCoords[$j][0] = '';
$arrayCoords[$j][1] = '';
}
});
console.log("found: " + $arrayCoords[$j][0] + $arrayCoords[$j][1]);
}
现在,我认为填充数组并使用它将是一个好主意。所以我这样做了:
$timeout = setInterval(function()
{
for($j = 0; $j < $rawArray.length; $j++){
console.log($globalGoogleArray[$j]);
}
if($globalGoogleArray.length == $rawArray.length)
{
console.log($globalGoogleArray);
//TODO: stopTimer();
}
}, 100);
就在console.log("found: " + $arrayCoords[$j][0] + $arrayCoords[$j][1]);
我添加了$globalGoogleArray[$j] = $arrayCoords[$j][0] + ", " + $arrayCoords[$j][1];
如果我可以使用我的值填充$globalGoogleArray
,那么我可以停止计时器并触发一个可以处理数组内容的函数。这可能不是最好的方式,我愿意接受建议,但是,我并没有以我想要的结束。计时器位于for
之上,其中的console.log只返回undefined,即使是for
中的console.log(这一个:console.log("found: " + $arrayCoords[$j][0] + $arrayCoords[$j][1]);
)确实输出了什么我希望它能输出。
有人可以告诉我为什么我无法在globalGoogleArray中获取地理编码的输出吗?
答案 0 :(得分:1)
跟踪回调函数中返回的调用次数。当最后一个返回时,处理您的$arrayCorrds
数组。
var resultCount = 0; //counter for number of calls that have returned
for($j = 0; $j < $rawArray.length; $j++){
...
$geocoder.geocode({
address: $baseStr
}, function(locResult, status) {
$arrayCoords[$j] = new Array();
if (status == google.maps.GeocoderStatus.OK) {
$arrayCoords[$j][0] = locResult[0].geometry.location.lat();
$arrayCoords[$j][1] = locResult[0].geometry.location.lng();
}else {
$arrayCoords[$j][0] = '';
$arrayCoords[$j][1] = '';
}
resultCount++; //increment count
if(resultCount === ($rawArray.length - 1)) {
//the last result has been retrieved, do something with $arrayCoords here
}
});
}
答案 1 :(得分:0)
所以,最后知识就像一杯冷水让我感到震惊。我只是想模拟一个循环。
我最终创建了两个相互调用的函数。我也认为这就是我应该如何处理这种情况。
函数1由具有空字符串的外部函数调用:
function collectCoords($fromGoogleStr){
//If being called with params, add them
if($fromGoogleStr)
$globalGoogleArray[($globalGoogleArray? $globalGoogleArray.length : 0)] = $fromGoogleStr;
//Generate address string here here\\
if ($tmpCounter < $fullArray.length - 1){
$tmpCounter++;
generateGoogleCoords($adressString);
}else{
//Do something with the complete answer
}
}
生成地址字符串后,请调用Google异步功能:
function generateGoogleCoords($baseStr){
$geocoder = new google.maps.Geocoder();
$arrayCoords = new Array();
$geocoder.geocode({
address: $baseStr
}, function(locResult, status) {
$arrayCoords[$j] = new Array();
$arrayCoords[$j][0] = locResult[0].geometry.location.lat();
$arrayCoords[$j][1] = locResult[0].geometry.location.lng();
collectCoords($arrayCoords[$j][0] + ", " +$arrayCoords[$j][1]);
});
}
所以,答案并不是什么新鲜事。当Google回答时,再次调用collect函数,并且所述函数中的if阻止所有这些进入永无止境的循环。
GL&安培; HF
阿克塞尔