yandex-maps-unofficial / vue-yandex-map

Yandex Maps Component for VueJS
MIT License
359 stars 103 forks source link

Добавить всплытие ошибки при инициализации карт в loadYmap #419

Open yuriylevchuk opened 2 years ago

yuriylevchuk commented 2 years ago

Мне необходимо обрабатывать ситуации когда произошла какая-то ошибка при инициализации карт Как пример: карты заблокированы в определенном регионе

    loadYmap(ymapConfig)
      .then(() => {
        // do some
      })
      .catch(() => {
        // do some
      })

Вариант решения

export function ymapLoader(settings = {}) {
  return new Promise((res, rej) => {
    if (window.ymaps) return res();

    if (document.getElementById('vue-yandex-maps')) {
      emitter.$on('scriptIsLoaded', res);
      return
    }

    const yandexMapScript = document.createElement('SCRIPT');
    const {
      apiKey = '',
      lang = 'ru_RU',
      version = '2.1',
      coordorder = 'latlong',
      debug = false,
      enterprise = false,
    } = settings;
    const mode = debug ? 'debug' : 'release';
    const settingsPart = `lang=${lang}${apiKey && `&apikey=${apiKey}`}&mode=${mode}&coordorder=${coordorder}`;
    const link = `https://${enterprise ? 'enterprise.' : ''}api-maps.yandex.ru/${version}/?${settingsPart}`;
    yandexMapScript.setAttribute('src', link);
    yandexMapScript.setAttribute('async', '');
    yandexMapScript.setAttribute('defer', '');
    yandexMapScript.setAttribute('id', 'vue-yandex-maps');
    document.head.appendChild(yandexMapScript);
    emitter.scriptIsNotAttached = false;
    yandexMapScript.onload = () => {
      ymaps.ready(() => {
        emitter.ymapReady = true;
        emitter.$emit('scriptIsLoaded');
        res();
      }, rej); // Вторым параметром в ready передаем коллбэк для ошибки
    };
   // На практике этой обработки недостаточно, так как этот скрипт может загрузиться успешно, 
   // но этот скрипт загружает еще один скрипт с другим доменом и там происходит ошибка
    yandexMapScript.onerror = rej; 
  });
}