【发布时间】:2017-12-17 08:36:27
【问题描述】:
我在 JavaScript 中遇到了 Promise 问题。我想要做的是我得到一个地址列表,然后对于每个地址,我需要调用地理编码 API 来获取 lat lng,然后我将继续将标记与热图一起绘制。这是我的代码:
let promiseKey = Promise.all(
result.map()
);
var addedMarkers = promiseKey.then(
markers => Promise.all(
markers.map()
)
)
.then(drawForecastHeatmap);
我调用geocode API的部分:
function getBranchLatLng(address, branchName, total, queKey){
return new Promise(function(resolve){
var key = jQuery.rand(geoCodKeys);
var url = 'https://maps.googleapis.com/maps/api/geocode/json?key='+key+'&address='+address+'&sensor=false';
$.ajaxq (qyName, {
url: url,
dataType: 'json'
}).done(function( data ) {
var address = getParameterByName('address', this.url);
var index = errorArray.indexOf(address);
try{
var p = data.results[0].geometry.location;
var latlng = new google.maps.LatLng(p.lat, p.lng);
var markerItem =
{
'lat': p.lat,
'lng': p.lng,
'address': address,
'branchName': branchName,
'total': total,
};
console.log(markerItem);
resolve(markerItem);
if (index > -1) {
errorArray.splice(index, 1);
}
}catch(e){
if(data.status = 'ZERO_RESULTS')
return false;
//on error call add marker function for same address and keep in Error ajax queue
getBranchLatLng( address, 'Error' );
if (index == -1) {
errorArray.push( address );
}
}
});
//mentain ajax queue set
queuCounter++;
if( queuCounter == setLimit ){
queuCounter = 0;
}
});
}
现在的问题是,程序只是在 getBranchLatLng() 处停止,甚至从未进入 addForecastMarker(),尽管我设法从地理编码中打印出一些 lat lng。
返回给我的一些地址:
jquery.min.js:4 GET https://maps.googleapis.com/maps/api/geocode/json?key=&address= 400 ()
然后当我尝试扩展链接时,我得到了这个:
error_message: "Invalid request. Missing the 'address', 'bounds', 'components', 'latlng' or 'place_id' parameter."
results :[]
status: "INVALID_REQUEST"
关于如何将带有“INVALID_REQUEST”的地址解析回 Promise 父级有任何想法吗?
谢谢!
【问题讨论】:
-
你没有在你的 getBranchLatLng 中使用 reject,你会得到一个错误,这就是 promise 停止的原因
-
@AmitWagner 你的意思是取出catch()那个块?
-
我的意思是在你的 ajax 函数中可能有一些错误。尝试始终解决以查看您的代码是否继续或使用拒绝并处理承诺链上的错误
-
jsfiddle.net/fLz2h661 查看我添加解析仅用于测试的 catch 中的代码。你需要在 catch 中使用 reject 并处理它
-
对于初学者来说,你错过了各种错误处理。因此,如果您的任何
Promise.all()调用中的任何承诺失败,那么您的其他代码都不会运行。您需要处处进行错误处理。甚至可以告诉你这里发生了什么。这是一个教科书式的错误承诺代码示例,它忽略了所有地方的错误。例如,如果您的 ajax 调用失败怎么办?您什么都不做 - 父承诺不会被拒绝或解决,因此Promise.all()调用将永远等待。
标签: javascript asynchronous promise geocode