CoffeeScript对象属性和闭包

rko*_*v93 0 javascript variables closures coffeescript

我有一个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
      )
Run Code Online (Sandbox Code Playgroud)

链接

为什么会出现这种情况以及为避免这种情况我应该做些什么

mu *_*ort 6

@userLocationMarker用一个null位置初始化:

@userLocationMarker = @placeMarker(null, null)
Run Code Online (Sandbox Code Playgroud)

然后你设置"真正的"位置handleMap:

handleMap = (position) =>
  #...
  @userLocationMarker.setPosition(pos)
Run Code Online (Sandbox Code Playgroud)

用作回调getCurrentPosition:

if navigator.geolocation
  @userPosition = navigator.geolocation.getCurrentPosition(
    handleMap
  )
Run Code Online (Sandbox Code Playgroud)

问题是它getCurrentPosition是异步的,因此在alert被调用之前就会handleMap调用它getCurrentPosition.凡是取决于什么getCurrentPosition呢必须是在handleMap回调或他们需要准备应对还未到达的数据.

您的示例代码中也存在拼写getCurrentPosition错误,您在if navigator.geolocation块中拼写错误.

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