33 lines
1.3 KiB
JavaScript
33 lines
1.3 KiB
JavaScript
/**
|
||
* public/index.html подключает API Яндекс.Карт через <script defer>,
|
||
* поэтому к моменту первого рендера window.ymaps может быть ещё undefined:
|
||
* скрипт не скачался, медленный CDN, блокировщик рекламы, офлайн.
|
||
*
|
||
* Без ожидания карта просто не создаётся — пользователь видит вечный спиннер
|
||
* без единой ошибки. Поэтому ждём появления API, но с таймаутом, и отдаём
|
||
* вызывающему явную ошибку вместо бесконечной загрузки.
|
||
*/
|
||
|
||
const DEFAULT_TIMEOUT_MS = 10000;
|
||
const POLL_INTERVAL_MS = 100;
|
||
|
||
export function whenYmapsReady(timeoutMs = DEFAULT_TIMEOUT_MS) {
|
||
if (window.ymaps?.ready) return Promise.resolve(window.ymaps);
|
||
|
||
return new Promise((resolve, reject) => {
|
||
const startedAt = Date.now();
|
||
|
||
const timer = setInterval(() => {
|
||
if (window.ymaps?.ready) {
|
||
clearInterval(timer);
|
||
resolve(window.ymaps);
|
||
return;
|
||
}
|
||
if (Date.now() - startedAt >= timeoutMs) {
|
||
clearInterval(timer);
|
||
reject(new Error("YMAPS_LOAD_FAILED"));
|
||
}
|
||
}, POLL_INTERVAL_MS);
|
||
});
|
||
}
|