Как добавить широту / lng в react-google-maps к this.state.markers

#javascript #google-maps #reactjs #mobx #mobx-react

#javascript #google-карты #reactjs #mobx #mobx-реагировать

Вопрос:

Я реализовал в этом:

  populateLocations() {
    var arrOfAdds = [],
        geocoder = new google.maps.Geocoder()

    this.props.properties.map(function(property, i) {
      if (geocoder) {
        geocoder.geocode({
          'address': property.street
        }, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
             // debugger
             arrOfAdds.push({
               position: {
                 lat: results[0].geometry.location.lat(),
                 lng: results[0].geometry.location.lng(),
               },
               key: i,
               defaultAnimation: 2,
             })
            }
        });
      }
    }, this)

   arrOfAdds.map(function(add, i) {
     this.state.markers.push(add)
   })

    console.log('arrOfAdds', arrOfAdds)
    console.log('this.state.markers', this.state.markers)
  }
  

Я пытаюсь в основном обновить this.state.markers (массив, в котором есть все мои lat / lngs, где будут удалены контакты) с тем, что находится в массиве arrOfAdds, но, полагаю, я не могу обновить this.state.markers?
Похоже, что когда я запускаю отладчик в функции, он пропускает this.props.properties.map(... и переходит прямо к arrOfAdds.map... , который с самого начала является пустым массивом, ничего не добавляет, а затем проходит через this.props.properties.map(... , чтобы создать правильно заполненные arrOfAdds .

Довольно смущен тем, как это сделать, хотел бы получить помощь.

Ответ №1:

geocoder.geocode, скорее всего, является асинхронной функцией, поэтому это означает, что ваш код добавления выполняется до получения фактических данных. Если вы переместите этот код внутри обратного вызова геокода, он, вероятно, будет исправлен (вы могли бы просто сделать this.state.markers.push и arrOfAdds полностью пропустить сбор. (обратите внимание, что закрытие еще не привязано к этому, кстати! поэтому лучше всего использовать функцию стрелки или привязку)

Примечание.Если ваш пример взят из компонента react, обратите внимание, что прямое изменение считается плохой практикой this.state , но setState его следует использовать. Но если ваши маркеры представляют собой наблюдаемый массив, это не имеет большого значения.

Комментарии:

1. Привет, @mweststrate! Спасибо за ответ. Сначала я попробовал ваше предложение, и мне не удалось заставить его работать, потому что «this» не определено внутри блока геокода — вы знаете, как это обойти?

2. да, используйте function(results, status) {}.bind(this) или создайте переменную в начале вашей функции var _this = this и используйте _this в обратном вызове. Но убедитесь, что вы понимаете, что здесь происходит! Это очень запутанно для начинающих, но очень важно для понимания javascript: github.com/getify/You-Dont-Know-JS/blob/master /…