我在使用javascript异步调用时遇到了一些问题。我得到了一个地址列表,对于每个地址,我使用地理编码来获取经度和纬度。然后,我继续格式化标记细节并将标记推入标记数组。我已经使用了一些承诺,但它似乎不起作用:
var markersToAdd = [];
function drawmap(mapData){
let promise = new Promise((resolve, reject) => {
// getlatlng
resolve(mapData);
});
promise.then((markersToAdd) => {
//loop
addMarker(markersToAdd[i]);
});
}
function getLatLng(address, branchName, total){
geocoder.geocode( { 'address': address }, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
} else {
alert('Geocode was not successful for the following reason: ' + status);
}
});
}
function addMarker(marker) {
}
现在的问题是,在我获得所有纬度和经度之前,承诺已经解决了。我的示例输出:
它在数组中的所有项目获得其纬度和经度之前解决了这个承诺。正确的是,它应该打印出所有细节,然后是“循环结束”'并且做了承诺'。
有关如何解决此问题的任何想法?先谢谢!
答案 0 :(得分:2)
如果启动异步函数(.geocode),在继续之前可能需要等待它。使用 await 可以在循环中等待,但是在这种情况下,允许比赛可能会更快(所有承诺一次开始,然后如果全部完成则继续):
首先我们需要宣传getLatLng
function getLatLng(address, branchName, total){
return new Promise(function(resolve){
geocoder.geocode(function(){
//do some stuff
resolve(markerItem);//i think you want to return a new object here right?
});
});
}
然后我们需要将 map mapData映射到promises,然后用Promise.all统一它们:
function drawmap(mapData){
//a promise to await them all
//it will resolve to an *markerItem* array, returned from getLatLng
let promiseKey = Promise.all(
//map el to getLatLng promise
mapData.map(el=>getLatLng(el.branchAddress, el.branchName,el.total))
);
//...
//E.g.
var addedMarkers = promiseKey.then(
markers => Promise.all(
markers.map(marker => addMarker(marker))
)
);
}