我有一个MapHandler类。

我创建了一个对象myMaphandler = new MapHandler,并调用了initialize方法。
但是@ userLocationMarker.getPosition()返回null :(

如果我要注释警报并从Chrome JS控制台调用@ userLocationMarker.getPosition(),我将获得必要的坐标。

class window.MapHandler

  initialize: (centerLocation) ->
    @makeMap(centerLocation)
    @defineUserLocation()
    alert @userLocationMarker.getPosition()


  makeMap: (centerLocation) ->
    myOptions =
      zoom: 14
      center: centerLocation
      mapTypeId: google.maps.MapTypeId.ROADMAP
    @map = new google.maps.Map(document.getElementById("map_canvas"), myOptions)


  placeMarker: (location, icon_path) ->
    if icon_path
      markerImage = new google.maps.MarkerImage(icon_path, null, null, null, new google.maps.Size(25, 25))
    else
      markerImage = null
    marker = new google.maps.Marker(
      position: location
      map: @map
      icon: markerImage)

  defineUserLocation: () ->
    @userLocationMarker = @placeMarker(null, null)

    handleMap = (position) =>
      pos = new google.maps.LatLng(position.coords.latitude, position.coords.longitude)
      infowindow = new google.maps.InfoWindow(
        map: @map
        position: pos
        content: 'Если это не ваше местоположение - передвиньте маркер'
      )
      @map.setCenter(pos)
      @userLocationMarker.setPosition(pos)

    if navigator.geolocation
      @userPosition = navigator.geolocation.getCurrentPositon(
        handleMap
      )


LINK

为什么会发生这种情况,为避免这种情况我该怎么做?

最佳答案

@userLocationMarker位置初始化null

@userLocationMarker = @placeMarker(null, null)


然后在handleMap中设置“真实”位置:

handleMap = (position) =>
  #...
  @userLocationMarker.setPosition(pos)


用作getCurrentPosition的回调:

if navigator.geolocation
  @userPosition = navigator.geolocation.getCurrentPosition(
    handleMap
  )


问题是getCurrentPosition是异步的,因此在alert调用handleMap之前将调用您的getCurrentPosition。取决于getCurrentPosition所做的任何事情都必须在handleMap回调中,否则它们需要准备好处理尚未到达的数据。

您的示例代码中还有一个错字,您在getCurrentPosition块中拼写了if navigator.geolocation错误。

当您尝试从JavaScript控制台检查位置时,getCurrentPosition调用了handleMap,并且@userLocationMarker的位置已正确初始化。

10-07 15:27