Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript承诺跳过for循环并立即解决_Javascript_Google Maps_Asynchronous_Promise - Fatal编程技术网

JavaScript承诺跳过for循环并立即解决

JavaScript承诺跳过for循环并立即解决,javascript,google-maps,asynchronous,promise,Javascript,Google Maps,Asynchronous,Promise,我在javascript异步调用方面遇到了一些问题。我得到了一个地址列表,对于每个地址,我使用地理编码来获得纬度和经度。然后,我继续格式化标记细节,并将标记推入标记数组。我使用了一些承诺,但似乎不起作用: var markersToAdd = []; function drawmap(mapData){ let promise = new Promise((resolve, reject) => { // getlatlng resolve(map

我在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),您可能希望在继续之前等待它。使用wait可以在循环中等待,但是在这种情况下,允许赛车的速度可能会更快(所有承诺立即开始,如果全部完成则继续):

首先,我们需要保证获得成功

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统一起来。所有:

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))
    )
  );
 }

如果启动异步函数(.geocode),您可能希望在继续之前等待它。使用wait可以在循环中等待,但是在这种情况下,允许赛车的速度可能会更快(所有承诺立即开始,如果全部完成则继续):

首先,我们需要保证获得成功

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统一起来。所有:

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))
    )
  );
 }

嗯,很抱歉,但是我要在承诺下执行for循环吗?另外,在本例中,如何从.then()调用addMarkercase@denisetan我留下的每一个代码都能正常工作。你仍然可以。那么(markersToAdd=>…)@denise tan根本不需要循环。这就是.map()为您所做的。@denis tan顺便说一句,删除markersToAdd=[]和markersToAdd.push(…),如果没有它,它将工作。非常感谢,但奇怪的是,当我试图从addMarker()打印时,它只打印出branchName和total。地址、lat和lng仍未定义。有什么想法吗?嗯,对不起,但是我要在承诺下执行for循环。全部还是全部?另外,在本例中,如何从.then()调用addMarkercase@denisetan我留下的每一个代码都能正常工作。你仍然可以。那么(markersToAdd=>…)@denise tan根本不需要循环。这就是.map()为您所做的。@denis tan顺便说一句,删除markersToAdd=[]和markersToAdd.push(…),如果没有它,它将工作。非常感谢,但奇怪的是,当我试图从addMarker()打印时,它只打印出branchName和total。地址、lat和lng仍未定义。有什么想法吗?