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

Geo*_*Geo 2 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];
Run Code Online (Sandbox Code Playgroud)

}

比方说我打电话myFunction.地理编码调用是异步的,对吧?所以它会快速执行并返回,在结果上调用回调.当我返回地址时,地理编码会完成吗?如何才能确保在返回之前完成这两个功能?

KOG*_*OGI 5

简答:不.你会几乎立刻得到的回线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];
  }
}
Run Code Online (Sandbox Code Playgroud)

请务必添加document.geoCodeRequestCompleteFlag++内部marker1.getPosition()marker2.getPosition()回调.

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