Mapbox не загружает маркеры, иногда - PullRequest
0 голосов
/ 08 июля 2019

Я использую Mapbox и на моем локальном хосте он всегда корректно загружает мои маркеры. Однако теперь, когда я развернул свое приложение, оно не стало.

Хотя бы иногда

Я заметил, что если я загружаю страницу, а затем непосредственно перед загрузкой страницы, я переключаюсь на другую вкладку и затем жду 5 секунд, а затем возвращаюсь на вкладку, где находится мое приложение. Он работает и загружает маркеры.

Кроме того, я получаю сообщение об ошибке: The source 'users' does not exist in the map's style. при попытке установить состояние объекта (при наведении курсора на элементы боковой панели в случае, если маркеры не загружались): map.setFeatureState({source: 'users', id: i}, { hover: true})

Я также заметил, что map.on('load', fn) не запускается, когда маркеры не загружены, потому что, если я добавлю console.log внутри него ... он не будет зарегистрирован (когда маркеры не загружаются)

То есть источник не загружен ...

Итак, я предполагаю, что это какой-то тип асинхронной проблемы, или, возможно, проблема с map.on('load', fn) может страдать из-за состояния гонки: https://github.com/mapbox/mapbox-gl-js/issues/6707.

Вот почему, когда я даю это время, перехожу на другую вкладку и затем возвращаюсь, это работает.

Но я не могу придумать решение.

У меня есть эта функция loadUsers, которая выполняет вызов API для моего бэкэнда, получает пользователей, а затем вызывает map.on('load', fn)

И я жду, когда получу пользователей:

     const res = await axios.get(`${apiUrl}?lat=${lat}&lng=${lng}`)
     const users = res.data;
     ...

Кто-нибудь может увидеть, где проблема? почему мои маркеры не загружаются?

Мой сайт в прямом эфире здесь: https://jamsesssion.com/

Вы можете увидеть код там, если вы проверяете и ищете файл: usersMap.js, нажав cmd + p в консоли chrome и выполнив поиск файла.

А это код:

async function loadUsers(map, lat = 52.5, lng = 13.4, apiUrl = `/api/users/near?lat=${lat}&lng=${lng}`) {
  const res = await axios.get(`${apiUrl}?lat=${lat}&lng=${lng}`)

      const users = res.data;
      if (!users.length) {
        alert('Oooops! \n\nThere are no registered users in the place you searched yet, If you live there, register to Jamsession and tell your friends!');
        return;
      }

      const geoJsonMarkers = users.map( (place, i ) => {
        const [placeLng, placeLat] = place.location.coordinates;
        const position = { lat: placeLat, lng: placeLng };

        return {
          'type': 'Feature',
          'geometry': {
            'type': 'Point',
            'coordinates': [position.lng, position.lat]
          },
          'id': i,
          'properties': {
            'name': place.name,
            'genres': place.genres,
            'photo': place.photo,
            'slug': place.slug,
          }
        }
      })
      let markers = { 'features': geoJsonMarkers }

      map.on('load', function() {

        map.addSource('users', {
        type: "geojson",
        data: markers,
        cluster: true,
        clusterMaxZoom: 22,
        clusterRadius: 50,
        })

          map.addLayer({
            id: "singles",
            type: "circle",
            source: "users",
            filter: ["!has", "point_count"],
            paint: {
                'circle-radius': {
                    'base': 10,
                    'stops': [[5, 20], [13, 50], [14, 60]]
                },
                // 'circle-color': '#ddffc8',
                'circle-color':  ["case",
                ["boolean", ["feature-state", "hover"], false],
                '#ff4da6',
                '#ddffc8'
                ],
              }
          });
}

1 Ответ

1 голос
/ 19 июля 2019

Возможно, вам потребуется разместить запрос map.on('load'..) вне функции loadUsers, чтобы карта ожидала завершения запроса loadUsers. Вы также можете создать отдельную функцию для добавления источника и слоев, которые также ожидают запрос loadUsers. Так что это может выглядеть примерно так:

map.on('load', function () { loadUsers(addSources) });

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...