JavaScript SDK RC9
Справочник публичных методов, параметров и событий SDK 1.0.0-rc.9.
На этой странице
Подключение и типы
SDK поставляется как браузерный ES-модуль. Подключите https://cdn.mmapps.ru/sdk/1.0.0-rc.9/index.css, затем импортируйте нужные функции из https://cdn.mmapps.ru/sdk/1.0.0-rc.9/index.js. Готовая HTML-страница.
Точные типы поставляются вместе с выпуском: точка входа TypeScript, экспорты SDK. Ссылки на типы ниже относятся к той же версии. Обозначение ? в сигнатурах означает необязательный аргумент.
| Экспорт | Назначение |
|---|---|
createClient |
Карта и клиент сервисного API |
createMap |
Отдельная карта |
createMapWidget |
Карта с готовыми инструментами |
checkedPoint |
Проверка координат |
createGeocoder |
Адресный клиент со своим обработчиком запросов |
createSearchController |
Состояние поиска и выбор адреса |
attachSearchControl |
Форма поиска в DOM-контейнере |
attachRouteControl |
Редактор маршрута |
attachContextMenu |
Меню действий с точкой |
createRouteOverlay |
Отображение рассчитанного маршрута |
routeView, routeCandidates, geocodedRouteView |
Подготовка ответа маршрута для интерфейса |
matrixView, geocodedMatrixView |
Проверка ответа матрицы |
createTimeline, attachTimelineControl |
Временные данные и панель воспроизведения |
MapSDKError, GeocoderError |
Классы ошибок |
Клиент и сервисные запросы
createClient(options?) → GeoClient. Без параметров создаёт клиент бесплатной карты. Параметры ClientOptions: apiBaseUrl, apiKey, catalogUrl, fetch, timeoutMs.
import { createClient } from 'https://cdn.mmapps.ru/sdk/1.0.0-rc.9/index.js';
const geo = createClient({
apiBaseUrl: 'https://mmapps.ru',
apiKey: 'YOUR_BROWSER_KEY',
});
const operationKey = crypto.randomUUID();
const result = await geo.geocoder.search(
{ q: 'Примерная улица', limit: 5 },
{ operationKey },
);
apiBaseUrl — адрес API без пути, параметров и фрагмента. Для сервисных вызовов используйте HTTPS и браузерный ключ с нужными правами и разрешённым origin. YOUR_BROWSER_KEY — условное обозначение. Серверный ключ в SDK не передавайте.
| Метод | Результат |
|---|---|
geo.createMap(options) |
Promise<GeoMap> |
geo.geocoder.search(query, options?) |
Подсказки адресов |
geo.geocoder.geocode(query, options?) |
Координаты по адресу |
geo.geocoder.reverse(query, options?) |
Адрес по точке |
geo.geocoder.resolve(ref, options?) |
Выбранный объект |
geo.routes.calculate(request, options?) |
Маршрут по координатам |
geo.routes.geocode(request, options?) |
Маршрут по адресам и подтверждённым точкам |
geo.routes.matrix(request, options?) |
Матрица по координатам |
geo.routes.matrixGeocode(request, options?) |
Матрица по адресам и подтверждённым точкам |
geo.on('usage', callback) |
Подписка на учёт операции; возвращает функцию отписки |
geo.on('error', callback) |
Подписка на ошибку; возвращает функцию отписки |
geo.destroy() |
Завершение работы клиента |
OperationOptions содержит signal?: AbortSignal и operationKey?: string. Для повторов сохраняйте ключ и тело запроса; изменение данных — новая операция. Если ключ не задан, SDK создаёт его сам. Отмена ожидания через signal не доказывает, что запрос не успел выполниться.
usage передаёт operationId, requestId, chargedMicrorub, funding, retryAfter, stage. При наличии в ответе доступны quantity, freeUnits, paidUnits, meter. Суммы и количества передаются строками. Правила оплаты, типы клиента.
Создание карты
createMap(options) → Promise<GeoMap> и geo.createMap(options) → Promise<GeoMap>. После создания дождитесь map.ready.
| Параметр | Назначение |
|---|---|
element |
Обязательный DOM-контейнер с заданной высотой |
mapId, catalogUrl |
Выбор карты и каталога у geo.createMap; по умолчанию ru и публичный каталог |
styleUrl |
URL собственного публичного стиля |
basemap |
{type: 'public', styleUrl, …} или {type: 'public_cdn', catalogUrl, mapId} |
view |
Начальные center, zoom, bearing, pitch |
initialPoint, editable |
Исходная точка и возможность её изменения |
theme |
'light' или 'dark' |
houseNumbers |
{minZoom?, sizeScale?} для поддерживаемой подложки |
controls, interactions |
Инструменты и жесты, описанные ниже |
renderMarker |
Отрисовщик маркера исходной точки и совместимых маркеров |
workerUrl |
URL worker из того же выпуска |
signal, timeoutMs |
Отмена и таймаут загрузки |
fetch |
Свой fetch у createMap; для geo.createMap задаётся на клиенте |
onReady, onLoading, onError |
Обратные вызовы состояния |
У публичного basemap дополнительно возможны styleSha256, styleBytes, assetSizes. Для обычного подключения достаточно mapId. houseNumbers.minZoom принимает 0–20, sizeScale — 0,5–2; стандартные значения — 16 и 1. Настройки меняют существующие подписи, а не добавляют данные.
Координаты GeoPoint имеют вид {latitude, longitude}. checkedPoint(latitude, longitude) проверяет конечные числа и диапазоны WGS84. GeoJSON использует обратный порядок: [longitude, latitude]. Bounds — {west, south, east, north}, экранная точка — {x, y}.
Состояние и события карты
| Метод или поле | Назначение |
|---|---|
map.ready |
Ожидание готовности |
map.getState() |
loading, ready, degraded, failed, destroyed |
map.waitForIdle({signal?, timeoutMs?}?) |
Ожидание завершения текущей отрисовки |
map.resize() |
Обновление размера после изменения контейнера |
map.setTheme(theme) |
Смена светлой или тёмной темы |
map.setBasemap(basemap) |
Асинхронная смена подложки с сохранением камеры и объектов |
map.setPoint(point) |
Установка исходной точки; null удаляет её |
map.getQueryPoint() |
Исходная точка или null |
map.focusPoint(point, zoom?) |
Фокус на точке |
map.fitPoints(points, options?), map.fitVisible(options?) |
Подбор видимой области |
map.on(type, callback), map.once(type, callback) |
Подписка, возвращающая отписку |
map.off(type, callback) |
Отмена подписки |
map.onPointChange(callback) |
Изменение исходной точки, причина drag или click |
map.onMarkerClick(callback) |
Клик по совместимому маркеру |
map.destroy() |
Удаление карты и принадлежащих ей ресурсов |
События указателя: click, dblclick, contextmenu, mousemove, mouseenter, mouseleave, pointerdown, pointerup, touchstart, touchend. События камеры: move, movestart, moveend, zoom, zoomend, rotate, pitch, resize, idle. Состояние: statechange, error, destroy.
Событие указателя содержит point, screen, objectId, originalEvent, stopPropagation() и preventDefault(). Типы карты и событий.
Для существующих интеграций сохранены setVisits(points), setMarkers(points), setTracks(tracks). Они принимают типы MapPoint и Track; при новом подключении используйте objects и createRouteOverlay. Типы совместимых методов.
Камера и жесты
map.camera |
Назначение |
|---|---|
getState(), getCenter(), getZoom(), getBounds() |
Чтение вида |
setView(view, transition?) |
Центр, масштаб, поворот и наклон |
panTo(point, transition?) |
Перемещение центра |
setZoom(zoom, transition?), zoomIn(transition?), zoomOut(transition?) |
Масштаб |
fitBounds(bounds, options?) |
Показать область |
fitObjects(ids?, options?) |
Показать объекты |
project(point), unproject(screenPoint) |
Перевод между координатами и пикселями |
setLimits({minZoom?, maxZoom?, bounds?}) |
Ограничение камеры; bounds: null снимает границу |
stop() |
Остановка анимации |
transition задаёт duration и mode: 'ease', 'fly' или 'jump'. FitOptions содержит maxZoom, duration, padding (число или отступы по четырём сторонам), resetOrientation.
map.interactions.getState(), set(options), enable(), disable() управляют жестами. Параметры: dragPan, scrollZoom (boolean или 'cooperative'), doubleClickZoom, touchZoom, touchRotate, dragRotate, touchPitch, keyboard.
Объекты и коллекции
map.objects.add(object) возвращает ObjectHandle. У каждого объекта обязательны уникальный id и kind.
kind |
Геометрия | Сокращённый метод |
|---|---|---|
marker |
point, необязательные draggable, renderer |
addMarker(object) |
line |
points |
addLine(object) |
polygon |
rings |
addPolygon(object) |
circle |
center, radiusM |
addCircle(object) |
rectangle |
bounds |
addRectangle(object) |
geojson |
geometry |
add({id, kind: 'geojson', geometry}) |
Сокращённые методы принимают те же поля без kind. Общие параметры: label, properties, visible, selected, style, collection, zIndex. Стиль: color, fillColor, width, opacity, fillOpacity, radius, dash.
objects также предоставляет get(id), getAll(), remove(id), clear(), replace(objects), getBounds(ids?), toGeoJSON(ids?), importGeoJSON(value, {replace?, collection?}?). batch(changes) принимает записи {action: 'upsert', object} или {action: 'remove', id}.
Поддерживаемая GeoJSON-геометрия: Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon, GeometryCollection. Используйте строковые ID объектов, JSON-совместимые properties и корректный порядок координат.
objects.createCollection(id) создаёт группу. Коллекция имеет id, add, get, getAll, remove, clear, setVisible, setFilter(predicate | null), setStyle, getBounds, on, once, destroy. События: add, change, remove, statechange, destroy.
Маркеры, карточки и подсказки
ObjectHandle содержит id, getData(), update(change), setVisible(boolean), setSelected(boolean), getBounds(), getPoint(), remove(), on(), once(), popup и tooltip. Через update нельзя менять id и kind.
События объекта: click, dblclick, contextmenu, mouseenter, mouseleave, dragstart, drag, dragend, change, remove, popupopen, popupclose.
popup и tooltip имеют одинаковые методы: open(content), update(content), load(loader), close(), isOpen(). content — {text?, element?, offset?, maxWidth?}. В load передаётся функция (signal) => Promise<PopupContent>; используйте сигнал для отмены своего запроса.
const marker = map.objects.addMarker({
id: 'example',
point: { latitude: 55.75, longitude: 37.61 },
label: 'Наша точка',
});
marker.popup.open({ text: 'Карточка места', maxWidth: 270 });
marker.update({ selected: true });
Для собственного маркера renderer(data) возвращает новый HTMLElement, объект {element, anchor?, offset?, update?, destroy?} или null для стандартного вида. Создавайте отдельный DOM-элемент для каждого маркера. Пользовательский текст вставляйте через textContent.
Кластеры
map.clusters.create(id, options?) → ClusterGroup; доступны также get(id), getAll(), clear(). Параметры группы: radius, maxZoom, minPoints, zoomOnClick, style. Это группировка Ваших точек в браузере, не адресный поиск.
const group = map.clusters.create('places', { zoomOnClick: true });
group.setPoints([
{ id: 'a', point: { latitude: 55.75, longitude: 37.61 } },
{ id: 'b', point: { latitude: 55.76, longitude: 37.62 } },
]);
| Метод группы | Назначение |
|---|---|
getState() |
Состояние, ревизия и количество точек |
setPoints(points), getPoint(id), getPoints(), clear() |
Данные |
batch(changes) |
{action: 'upsert', point} или {action: 'remove', id} |
setVisible(value), setFilter(predicate | null), setStyle(style) |
Отображение |
getBounds(), getRendered(limit?) |
Область и отображённые узлы |
getChildren(reference, options?) |
Непосредственные дочерние узлы |
getLeaves(reference, {limit?, offset?, signal?, timeoutMs?}?) |
Исходные точки кластера |
getExpansionZoom(reference, options?) |
Масштаб раскрытия |
expand(reference, options?) |
Раскрыть кластер камерой |
on(type, callback), once(type, callback), destroy() |
Подписки и удаление |
ClusterPoint содержит id, point, необязательные label, properties, selected. ClusterSnapshot — {nodes, truncated, loading}. Узел имеет kind: 'cluster' с reference или kind: 'point' с исходной точкой. Reference принадлежит конкретной ревизии группы; после изменения данных получите новый, иначе возможен STALE_CLUSTER.
События: click, dblclick, contextmenu, mouseenter, mouseleave, change, destroy, error. Стиль: color, pointColor, selectedColor, textColor, clusterRadius, pointRadius, textSize, opacity, textFont. Для запросов узлов доступны signal, timeoutMs, у getChildren также limit, у expand — параметры перехода камеры.
Инструменты карты
map.controls.set(id, options) включает или настраивает встроенный инструмент; false выключает его. Общие параметры: position (top-left, top-right, bottom-left, bottom-right), visible, margin.
| ID | Дополнительные параметры |
|---|---|
navigation |
showZoom, showCompass, visualizePitch |
scale |
unit: 'metric' / 'imperial' / 'nautical', maxWidth |
attribution |
compact; сохраняйте требуемую атрибуцию данных |
fullscreen |
container, pseudo |
geolocation |
trackUserLocation, showUserLocation, showAccuracyCircle, zoomToUserAccuracy, maxZoom, positionOptions |
theme |
Общие параметры размещения |
Геолокация использует разрешение браузера. positionOptions содержит enableHighAccuracy, timeout, maximumAge.
controls.add({id, element, position?, visible?, margin?, onAdd?, onRemove?}) добавляет свой инструмент. Также доступны get(id), getAll(), remove(id), clear().
ControlHandle: id, element, getState(), setPosition(), setVisible(), setMargin(), focus(), remove(), destroy(). Полные типы инструментов.
Поиск и выбор адреса
createSearchController({client, map?, filters?, language?, limit?, fitResults?}) создаёт контроллер. client — geo.geocoder или результат createGeocoder().
В выпуске SDK 1.0.0-rc.11 предусмотрен параметр mapContext: при наличии map он включён по умолчанию и передаёт снимок центра и области карты. mapContext: false оставляет намеренно глобальный поиск. Движение карты само по себе запросов не делает; текстовый Enter использует тот же поиск подсказок, не добавляя геокодинг. Для этой возможности требуется подключить именно этот выпуск после его публикации.
| Метод | Назначение |
|---|---|
getState(), getResponse() |
Состояние интерфейса и последний ответ |
search(q, options?), geocode(q, options?) |
Текстовый запрос |
reverse(point, radiusM?, options?) |
Обратный поиск |
confirm(ref) |
Явный локальный выбор; возвращает Promise<SearchSelection> |
setSelectionOpen(boolean) |
Открыть или закрыть карточку |
useContext(ref) |
Выбрать контекст поиска |
setFilters(filters), clear() |
Фильтры и очистка состояния |
on(type, callback), destroy() |
Подписки и освобождение ресурсов |
filters поддерживает country_codes и ссылки region, locality, street. События контроллера: change, confirm, response, error. Фазы SearchState: idle, loading, candidates, not_found, needs_context, outside_coverage, selected, error, destroyed.
SearchSelection содержит candidate, ref, point, alternative, queryPoint, userConfirmed: true. Выбор не вызывает новый HTTP-запрос. point может быть null; не создавайте из него маршрут.
map.controls.addSearch(options) размещает поиск на карте. Передайте либо controller, либо client с настройками filters, language, limit, fitResults. Общие настройки: размещение, debounceMs, placeholder, width, onSelect, onRoute, onShare. Результат SearchMapControl дополнительно имеет controller, dockElement, openSelection(), closeSelection().
Для своей вёрстки используйте attachSearchControl({controller, element, dockElement?, debounceMs?, placeholder?, onSelect?, onRoute?, onShare?}). Результат: element, dockElement, focus(), setVisible(), openSelection(), closeSelection(), destroy(). Самостоятельно созданный контроллер освобождайте отдельно.
onRoute(selection) и onShare(selection) выполняют действия Вашего приложения; само открытие карточки не рассчитывает маршрут. Пример подключения, типы поиска.
Свой обработчик запросов геокодера
createGeocoder({baseUrl, fetch?, timeoutMs?, signal?, credentials?, paths?, requestHeaders?}) → Geocoder нужен для подключения к своему backend. Методы: search, geocode, reverse, resolve.
paths задаёт пути этих четырёх операций, requestHeaders(operation, options?) — заголовки. credentials принимает 'omit' или 'same-origin'. Для прямого подключения к API Ммаппс используйте createClient с браузерным ключом. В resolve первый аргумент — сам ref, а не {ref}; дополнительные параметры — language, signal, operationKey.
Расчёт и отображение маршрута
geo.routes.calculate({start, end, via?, profile?}, options?) принимает GeoPoint, профиль — 'car'. geo.routes.geocode() принимает в каждой позиции {point}, {ref} или {q}. Текст требует подтверждения. Запросы и результаты.
routeView(response) возвращает {track, input, snapped, distanceM, durationS, routingVersion}. track может быть null. geocodedRouteView(response) возвращает {route, waypoints}, где каждый waypoint содержит index, point, candidates. routeCandidates(value) извлекает кандидатов из результата геокодинга. Эти функции работают с готовым ответом и не отправляют запросов.
import { createRouteOverlay } from 'https://cdn.mmapps.ru/sdk/1.0.0-rc.9/index.js';
const overlay = createRouteOverlay(map);
overlay.set(routeResponse); // Ответ calculate() или geocode().
overlay.fit();
// overlay.clear();
// overlay.destroy();
createRouteOverlay(map) создаёт слой. set(response | null), clear(), fit(), destroy() управляют им. Результат no_route не превращается в прямую линию.
Редактор маршрута
attachRouteControl(map, service, {recalculate?}?) → RouteControl. service должен предоставлять calculate, например geo.routes. recalculate: 'on-change' пересчитывает после завершённых изменений пользователем; 'manual' требует явного расчёта.
| Метод | Назначение |
|---|---|
getState() |
visible, picking, phase, stops, operationKey, errorCode |
open(destination?), close() |
Открыть или закрыть редактор; destination подтверждает конечную точку |
setStops(stops) |
Программно задать точки без расчёта |
chooseEndpoint('start' / 'end', stop) |
Выбрать конечную точку с учётом режима пересчёта |
acceptSelection(selection) |
Принять явно выбранную точку; возвращает boolean |
pick(index) |
Выбрать остановку на карте |
calculate(options?) |
Выполнить расчёт |
cancel(), fit() |
Отменить ожидание или показать маршрут |
on(type, callback), destroy() |
Подписки и удаление |
RouteStop — {point, label?}; в списке остановок допускаются незаполненные null. События: change, result, error. Фазы: editing, loading, route, no_route, error. Типы редактора.
Матрица расстояний
geo.routes.matrix({sources, targets, profile?}, options?) → Promise<MatrixResponse> рассчитывает пары координат. geo.routes.matrixGeocode() использует {point}, {ref} или {q} в списках. Профиль — 'car', параметры операции — signal, operationKey.
const operationKey = crypto.randomUUID();
const matrix = await geo.routes.matrix({
sources: [{ latitude: 55.75, longitude: 37.61 }],
targets: [{ latitude: 55.76, longitude: 37.62 }],
profile: 'car',
}, { operationKey });
const cell = matrix.cells[0][0];
if (cell.status === 'ok') {
// cell.distance_m — метры; cell.duration_s — секунды.
}
matrixView(value, expected?) проверяет готовый ответ, необязательный expected — исходный MatrixRequest. geocodedMatrixView(value, expected) принимает обязательный GeocodeMatrixRequest. Обе функции возвращают проверенный ответ и не вызывают API.
До подтверждения текстовых адресов matrix равна null. Для no_route расстояние и время равны null. Ограничения, тариф и подтверждение адресов, типы матрицы.
Таймлайн
createTimeline(map, {data, time?, markerRenderer?, observationInterpolation?}) → Timeline отображает временные данные Вашего приложения. Время — Unix в миллисекундах UTC.
import { createTimeline, attachTimelineControl } from 'https://cdn.mmapps.ru/sdk/1.0.0-rc.9/index.js';
const from = Date.UTC(2026, 0, 1, 9);
const to = from + 60 * 60 * 1000;
const timeline = createTimeline(map, {
data: {
version: 1,
range: { from, to },
referenceTime: from,
entities: [{
id: 'example',
label: 'Наш объект',
locations: [{
id: 'stop', from, to, basis: 'planned',
point: { latitude: 55.75, longitude: 37.61 },
}],
}],
},
time: from,
});
const control = attachTimelineControl(map, timeline);
// При удалении: control.destroy(); timeline.destroy();
TimelineData: version: 1, range: {from, to}, referenceTime, entities. Каждый объект имеет id, необязательные label, locations, observations. Местоположение: {id, from, to?, point, basis, label?}, где basis — 'reported' или 'planned'; интервал [from, to). point: null означает неизвестную координату. Наблюдение: {at, point, accuracyM?}.
| Метод | Назначение |
|---|---|
getSnapshot() |
Время, период, воспроизведение и позиции объектов |
setData(data) |
Обновить данные |
seek(time) |
Перемотка |
play({speed?}?), pause() |
Воспроизведение |
getRoutePlans(selection) |
Подготовить планы расчёта без сети |
prepareRoutes(client, options) |
Явно выполнить ограниченное число запросов маршрута |
clearRoutes() |
Удалить подготовленные маршруты |
on('change' / 'destroy', callback), destroy() |
Подписки и удаление |
Без включённой интерполяции промежутки между наблюдениями остаются неизвестными. observationInterpolation: {maxGapMs} явно разрешает оценку между соседними измерениями; maxGapMs — 1–600 000 мс. В TemporalPosition.source различаются location, observation, interpolated, unknown.
Выбор для плана — {entityId, basis, intermediate: 'observations' / 'none', from?, to?}. Для prepareRoutes дополнительно обязательны maxRequests, operationKeyPrefix, необязателен signal. Сохраняйте префикс для повторов. Результат содержит requested, reused, prepared, noRoute. Подготовка вызывает платный расчёт маршрута; перемотка и воспроизведение — локальные действия.
attachTimelineControl(mapOrElement, timeline, {order?, onPrepareRoutes?}?) создаёт панель. Она предоставляет element, setVisible(boolean), destroy(). onPrepareRoutes({entityId, basis}) открывает Ваш интерфейс подготовки; само воспроизведение его не вызывает. Все типы таймлайна.
Панели и меню точки
map.layout.mount({id, element, slot: 'top' / 'bottom', order?, visible?}) размещает панель в общем стеке. Меньший order — ближе к центру карты. map.layout.reserve({id, element, edge, gap?}) резервирует место под уже размещённую панель приложения; edge — top, bottom, left, right.
Оба метода возвращают LayoutHandle: element, setVisible(), remove(), destroy(). layout.getInsets() читает отступы, layout.onChange(callback) подписывается на их изменение и возвращает отписку.
attachContextMenu(map, {element, search?, routes?, onError?}) подключает меню к контейнеру карты. Передайте существующий SearchController и RouteControl. Меню открывается правой кнопкой мыши или с клавиатуры; действия — «Что здесь?», «Маршрут отсюда», «Маршрут сюда». Недоступные сервисы не выполняются.
MapContextMenu содержит element, open(point, screen?), close(), isOpen(), destroy(). Открытие меню бесплатно. Только выбор действия запускает обратный поиск или выбор точки маршрута с учётом режима пересчёта.
Готовый виджет
createMapWidget(options) → Promise<MapWidget> объединяет инструменты карты. Используйте параметры карты, кроме editable, и добавьте нужные сервисы:
import { createClient, createMapWidget } from 'https://cdn.mmapps.ru/sdk/1.0.0-rc.9/index.js';
const geo = createClient({ apiBaseUrl: 'https://mmapps.ru', apiKey: 'YOUR_BROWSER_KEY' });
const widget = await createMapWidget({
element: document.getElementById('map'),
mapId: 'ru',
services: { geocoder: geo.geocoder, routes: geo.routes },
search: { placeholder: 'Адрес или координаты' },
routing: { recalculate: 'manual' },
});
await widget.ready;
// При удалении: widget.destroy(); geo.destroy();
Параметры виджета: services, search (настройки поиска или false), routing (boolean или настройки редактора), controls (без search), timeline, timelineControl, contextMenu, onSelect, onRoute, onShare, onError. Меню точки по умолчанию включено, contextMenu: false отключает его.
Виджет предоставляет map, ready, search, routes, timeline, contextMenu; необязательные инструменты могут быть null. setServices(services) меняет сервисы, сохраняя публичную карту и внешние объекты. destroy() освобождает виджет. Типы виджета.
Ошибки и завершение работы
MapSDKError содержит code, httpStatus, retryable, requestId, operationId, retryAfter, stage. GeocoderError дополнительно предоставляет status. Используйте эти поля для сообщения об ошибке и решения о повторе.
Локальные коды включают INVALID_ARGUMENT, DESTROYED, ABORTED, DEADLINE_EXCEEDED, RESOURCE_UNAVAILABLE, WORKER_CONFLICT, RENDERER_ERROR, INVALID_RESPONSE, STALE_CLUSTER, BUSY, RANDOM_SOURCE_UNAVAILABLE. Коды сервисного API описаны в разделе ошибок.
Храните функции отписки и возвращаемые handles. При размонтировании удаляйте самостоятельно созданные панели и контроллеры, затем карту и клиент. destroy() карты и виджета освобождает принадлежащие им ресурсы; внешний API-клиент освобождается отдельно. Не создавайте новые экземпляры при каждом обновлении состояния компонента.