javascript - 该函数会在返回之前等待异步函数完成吗?

标签 javascript google-maps

假设我有这些地理编码调用:

function myFunction(marker1,marker2) {
  var firstAddress  = null;
  var secondAddress = null;
  geocoder.geocode({'latLng': marker1.getPosition()}, function(results, status) {
    # if geocoding successful, set firstAddress
  })

  geocoder.geocode({'latLng': marker2.getPosition()}, function(results, status) {
    # if geocoding successful, set secondAddress
  })
  return [firstAddress,secondAddress];

假设我调用了 myFunction。地理编码调用是异步的,对吧?因此它将快速执行并返回,调用结果回调。当我返回地址时,地理编码是否已经完成?如何确保两个函数在返回前完成?

最佳答案

简短的回答:没有。您几乎会立即到达 myFunction 的返回行,很可能在 AJAX 完成之前

最好的办法是强制 geoCoder 的请求同步。如果不能,那么您需要做的是设置一个全局标志,指示两个请求何时完成并等待设置该标志。如果是,那么您可以收集数据、构建数组并将其返回。

function myFunction(marker1,marker2) {
  var firstAddress  = null;
  var secondAddress = null;

  document.geoCodeRequestCompleteFlag = 0;

  geocoder.geocode({'latLng': marker1.getPosition()}, function(results, status) {
    # if geocoding successful, set firstAddress
  })

  geocoder.geocode({'latLng': marker2.getPosition()}, function(results, status) {
    # if geocoding successful, set secondAddress
  })

  setTimeout( function( ) {
    document.geoCodeRequestCompleteFlag = -1;
  }, 15000 ); // -- ensure that we don't get stuck indefinitely

  while( document.geoCodeRequestCompleteFlag < 2 && document.geoCodeRequestCompleteFlag > 0 ) {
    // wait
  }

  if( document.geoCodeRequestCompleteFlag < 0 ) {
    return 'timeout';
  } else {
    return [firstAddress,secondAddress];
  }
}

请务必在您的 marker1.getPosition()marker2.getPosition() 回调中添加一个 document.geoCodeRequestCompleteFlag++

这样做的缺点是,如果您的请求需要很长时间,浏览器可能会终止您的脚本。

关于javascript - 该函数会在返回之前等待异步函数完成吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6284457/

相关文章:

javascript - 如何在 Angular 7 中剪切每个数字处的字符串并创建一个新行?

javascript - 创建路由 Express.js 和 MySql

javascript - 除了 javascript 之外,还有其他用于客户端编程的编程语言吗?

algorithm - map API : Finding the longest common path in two given paths

javascript - Google map 标记 - 为每个标记添加一个带有唯一标签的自定义图标

javascript - React Native 在 render 方法中使用 let 或 var

php - 将 php 数组传递给 javascript

Android:在 map 上显示和移动当前位置

javascript - 地球夜间 map 的异步加载

javascript - 在 Rails 的 Gmaps 中默认打开 infoWindow