gpt4 book ai didi

JavaScript Promise 跳过了 for 循环并立即解决

转载 作者:行者123 更新时间:2023-12-01 03:17:28 24 4
gpt4 key购买 nike

我在 javascript 异步调用方面遇到了一些问题。我得到了一个地址列表,对于每个地址,我使用地理编码来获取纬度和经度。然后,我继续格式化标记详细信息并将标记插入标记数组中。我使用了一些 promise ,但它似乎不起作用:

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) {

}

现在的问题是,在我获得所有纬度和经度之前, promise 就已经解决了。我的示例输出:

它在数组中的所有项目获得其纬度和经度之前解决了 promise 。正确地说,它应该打印出所有详细信息,然后是“循环完成”和“完成 promise ”。

我该如何解决这个问题?

最佳答案

如果您启动异步函数 (.geocode),您可能需要等待,然后再继续。使用 await 可以在循环中等待,但是在这种情况下,允许竞赛可能会更快(所有 promise 立即开始,如果全部完成则继续):

首先我们需要 promise 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?
});
});
}

然后我们需要将mapData映射到promise,然后将它们与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))
)
);
}

关于JavaScript Promise 跳过了 for 循环并立即解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45459180/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com