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

超fkcb

我在使用 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),您可能希望在继续之前等待它。使用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?
        });
     });
}

然后我们需要将 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))
    )
  );
 }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

解决JavaScript中的承诺

来自分类Dev

原生 javascript 承诺循环

来自分类Dev

JavaScript跳过循环

来自分类Dev

Javascript承诺不等待解决

来自分类Dev

for循环跳过间隔javascript

来自分类Dev

for循环跳过间隔javascript

来自分类Dev

解决DOM事件上的JavaScript承诺

来自分类Dev

javascript:重试直到解决承诺然后执行

来自分类Dev

对于循环,异步等待,承诺-Javascript

来自分类Dev

JavaScript 承诺不等待循环完成执行

来自分类Dev

卡在 forEach 循环中的 javascript 承诺

来自分类Dev

潜在的异步函数返回立即解决的承诺?

来自分类Dev

潜在的异步函数返回立即解决的承诺?

来自分类Dev

使用jQuery循环解决承诺

来自分类Dev

根据响应跳过承诺中的jQuery承诺

来自分类Dev

如何阻止JavaScript承诺并返回已解决的结果?

来自分类Dev

JavaScript的承诺:无法理解何时解决范围

来自分类Dev

如何尝试直到解决为止(JavaScript中的承诺)

来自分类Dev

如何从已解决的承诺 javascript 中提取数据?

来自分类Dev

返回承诺跳过Ajax调用

来自分类Dev

javascript循环承诺使用参数中的数组进行迭代

来自分类Dev

JavaScript循环跳过数组中的项目

来自分类Dev

为什么我的JavaScript for循环跳过元素?

来自分类Dev

JavaScript跳过每月的周六和周日循环

来自分类Dev

如何在循环JavaScript中跳过数字?

来自分类Dev

JavaScript循环跳过数组中的项目

来自分类Dev

JavaScript承诺反向加载

来自分类Dev

javascript中的递归承诺

来自分类Dev

JavaScript承诺混乱