我在使用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) {

}


现在的问题是,在我得到所有纬度和经度之前,诺言已经得到解决。我的示例输出:

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

有想法该怎么解决这个吗?提前致谢!

最佳答案

如果启动异步功能(.geocode),则可能需要先等待它,然后再继续。等待可能会在循环中等待,但是在这种情况下,允许竞速可能会更快(所有的诺言立即开始,如果所有的诺言都完成,则继续):

首先,我们需要将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 - JavaScript许诺跳过循环并立即解决,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45459180/

10-14 17:11
查看更多