Saltar al contenido principal

kaleidr.js, el cargador

kaleidr.js es el único script inicial de todos los elementos incrustados de Kaleidr. Define el objeto global window.Kaleidr y el elemento personalizado <kaleidr-map>. Es pequeño: no contiene biblioteca de mapas ni código de productos. Al montar uno, carga su paquete desde la misma CDN y le entrega las opciones.

<script src="https://cdn.kaleidr.com/embed/v1/kaleidr.js"></script>

No hay paquete npm. La etiqueta de script es la única forma de cargar el SDK. Para React, Next.js, Vue y TypeScript, consulta Integración con frameworks.

Cargar el script​

PreguntaRespuesta
¿Dónde va la etiqueta?En cualquier lugar. Los elementos <kaleidr-map> se montan tanto si aparecen antes como después de la etiqueta.
¿Cuándo puedo llamar a Kaleidr.mount?Después de que se ejecute el script. Con una etiqueta <script src> normal, cualquier script posterior puede llamarlo.
¿Puedo usar async o defer?Sí para los elementos. Para Kaleidr.mount, espera al evento load de la etiqueta, porque window.Kaleidr no existe hasta entonces.
¿Con qué frecuencia?Una vez por página.
¿Puedo añadir integrity?No. El archivo se actualiza en su ruta, y un hash fijo dejaría de coincidir en la siguiente versión. Consulta Versionado de CDN.
¿Se ejecuta en el servidor?No. Necesita window y document. En aplicaciones renderizadas en servidor, cárgalo solo en el navegador.

Para cargar el script con async y montar el producto cuando llegue:

<div id="map" style="height:480px"></div>
<script>
const s = document.createElement('script');
s.src = 'https://cdn.kaleidr.com/embed/v1/kaleidr.js';
s.async = true;
s.onload = () => {
Kaleidr.mount('#map', { product: 'viewer', shareId: 'YOUR_MAP_ID' });
};
document.head.appendChild(s);
</script>

window.Kaleidr​

MiembroDescripción
Kaleidr.mount(target, options)Monta un producto en un elemento y devuelve un controlador.
Kaleidr.init()Inicializa elementos <kaleidr-map> que ya están en el documento. Rara vez se necesita.
Kaleidr.enable(on)Activa o desactiva todos los montajes posteriores.
Kaleidr.versionCadena de versión del cargador.

Kaleidr.mount(target, options)​

const handle = Kaleidr.mount('#chat', {
product: 'chat',
publishableKey: 'kld_pk_live_…',
map: myMap,
contained: true,
});
ParámetroTipoDescripción
targetSelector CSS o HTMLElementElemento de destino. Un selector se resuelve una sola vez mediante document.querySelector.
optionsobjetoObligatorio. Consulta Opciones.

Devuelve un controlador.

Comportamiento:

  • Devuelve inmediatamente. El intercambio de sesión y la carga del paquete del producto suceden en segundo plano. Las llamadas al controlador mientras tanto se guardan y se aplican por orden cuando el producto está listo. En Viewer y Tile ocurre cuando el mapa dentro del iframe indica que está listo; así, un setCamera justo después de mount funciona.
  • No lanza excepciones al fallar un montaje. Un destino inexistente, un paquete que no carga, una sesión rechazada o un ID inválido generan un error de consola que contiene [kaleidr:<product>]. Aun así obtienes un controlador, cuyos métodos no hacen nada. La única llamada que lanza una excepción es montar sin objeto de opciones: Kaleidr.mount('#map') produce un TypeError.
  • No notifica el resultado a tu código. No hay promesa que esperar ni callback. Consulta Cómo saber si se montó correctamente.
  • Un montaje por destino. No se admite montar otro producto en un destino ocupado. Llama a handle.destroy() en el primero antes de montar de nuevo. Es seguro destruir y remontar en el mismo elemento en cualquier momento, incluso si la primera carga sigue en curso; el montaje destruido no añadirá contenido ni afectará al nuevo.

Opciones​

OpciónTipoValor predeterminadoProductosDescripción
product'chat' | 'viewer' | 'editor' | 'tile'ninguno; obligatoriotodosProducto que se montará.
publishableKeycadenaningunochat, editor, tileTu clave publicable kld_pk_…. El SDK la intercambia por una sesión breve y solo entrega la sesión al producto. No la pases a Viewer. Una clave de servidor (kld_sk_…) se rechaza antes de enviar solicitudes.
shareIdcadenaningunoviewer, chatViewer: ID del mapa publicado. Chat sin clave: el mapa publicado cuyo propietario proporciona la conversación.
mapIdcadenaningunoviewerAlias de shareId cuando no se proporciona shareId.
styleIdcadenamapa base predeterminado de la organizacióntile, editorID de estilo como kaleidr-morning, o URL completa de estilo.
mapinstancia activa de mapaningunochatObjeto de mapa que el asistente controla: Mapbox GL JS, MapLibre GL JS, Google Maps o Leaflet. Consulta Mapas compatibles. Omítelo para Chat sin mapa.
mapTargetselector CSSningunochatElemento Viewer o Tile <kaleidr-map> que el asistente controlará en lugar de map.
containedbooleanofalsechatAncla el panel al destino, que debe tener posición y tamaño. Por defecto flota fijo en la esquina superior izquierda de la pantalla.
langcadenael <html lang> válido de la página, si no, ingléschatIdioma de respuesta, en formato BCP 47 como en, ko o pt-BR. Consulta Idioma de Chat.
titlecadenatítulo propio del panelchatTítulo de la cabecera; en el elemento la propiedad es chat-title.
placeholdercadenamarcador de posición propio del panelchatTexto orientativo del campo de entrada.
center[longitude, latitude]predeterminado del productoviewer, tile, editorCentro inicial.
zoomnúmeropredeterminado del productoviewer, tile, editorZoom inicial. En Viewer y Tile solo funciona junto con center.
pitchnúmeropredeterminado del productoviewer, tile, editorInclinación inicial, en grados.
bearingnúmeropredeterminado del productoviewer, tile, editorRotación inicial, en grados.
themeobjeto o cadena de objeto JSONningunochat, editorChat: propiedades CSS personalizadas, por ejemplo { '--highlight-color': '#0b5fff' }. Editor: 17 claves de tema. Una cadena que no sea JSON se ignora con advertencia.
enabledbooleanoningunotodosControl por montaje de la puerta de activación. Solo se lee al montar.
baseURLhttps://cdn.kaleidr.comtodosOrigen de los paquetes. Se usa solo el origen y los paquetes se piden en /embed/v1/ en ese origen. Solo se aceptan los de Sustitución de base; otros se ignoran con advertencia.
viewerBaseURLhttps://map-embed.kaleidr.comviewer, tileOrigen del iframe; solo se usa el origen.
apiBaseURLhttps://api.kaleidr.com/inference-apichat, editor, tileServidor para el intercambio de sesión y las solicitudes del producto. Debe incluir /inference-api; un origen sin ruta devuelve 404.
tileBaseURLhttps://tile.kaleidr.comeditorHost donde se resuelven los IDs de estilo.

Notas:

  • apiKey es un alias obsoleto de publishableKey.
  • Las cuatro opciones …Base sirven para probar otros despliegues. No se necesitan en producción. base mueve solo los paquetes: la página del mapa, la API y el servidor del mapa base permanecen en Kaleidr salvo que muevas cada uno.
  • lang, title y placeholder se leen al montar; para modificarlos, destruye y monta de nuevo.
  • Las opciones que un producto no usa se ignoran sin mensaje.

Sustitución de base​

base (opción o atributo) y la variable global window.__KALEIDR_EMBED_BASE__ indican el origen desde el que se cargan los paquetes. Solo se respeta la sustitución si el origen es uno de estos:

Origen aceptadoEjemplo
CDN de Kaleidrhttps://cdn.kaleidr.com
El origen desde el que se cargó kaleidr.jsSirves kaleidr.js desde https://static.example.com, y base es https://static.example.com.
El origen de la páginaLa página está en https://www.example.com/… y base es https://www.example.com.

Los demás valores se ignoran. El producto se monta, pero carga los paquetes desde la CDN predeterminada y se emite una advertencia por ese valor:

[kaleidr] base "https://other.example.net" is IGNORED — bundles load from https://cdn.kaleidr.com. A base must be the Kaleidr CDN, the origin kaleidr.js was loaded from, or this page's own origin.

La variable global debe ser una cadena; se ignora cualquier otro tipo sin aviso. El alojamiento propio funciona según esta regla cuando el cargador y los paquetes se sirven desde el mismo origen.

Valores predeterminados de cámara según el producto:

ProductoCámara predeterminada
viewerVista guardada por el autor del mapa.
tileVista inicial del estilo, o el mundo entero.
editorCentro [0, 0], zoom 2, inclinación 0, rotación 0.
chatNo aplicable: Chat no crea un mapa.

Los detalles están en cada referencia: Chat, Viewer, Tile, Editor.

El controlador​

Kaleidr.mount devuelve la misma estructura en todos los productos.

interface KaleidrHandle {
readonly product: 'chat' | 'viewer' | 'editor' | 'tile';
setCamera(camera: {
center?: [number, number]; // [longitude, latitude]
zoom?: number;
pitch?: number;
bearing?: number;
duration?: number; // milliseconds
}): void;
setTheme(theme: string | Record<string, string>): void;
setStyle(style: string): void;
destroy(): void;
}

Todos los controladores tienen los mismos métodos, aunque su funcionamiento depende del producto:

Métodochatviewereditortile
setCamera(camera)adviertesísísí
setTheme(theme)síadvierteadvierteadvierte
setStyle(style)advierteadvierteadviertesí
destroy()sísísísí

«Advierte» significa que no hace nada y muestra un mensaje de consola:

[kaleidr] setCamera() is not supported on product "chat" — the call is a no-op. See the handle matrix at https://docs.kaleidr.com/sdk/kaleidr-map-element#handle-matrix.

Forma parte del contrato /embed/v1: un método no admitido nunca lanza una excepción.

Notas sobre los métodos:

  • setCamera: los campos omitidos conservan su valor. duration anima el movimiento; sin este valor, o con 0, salta directamente. Chat no admite setCamera porque no posee un mapa, aunque el asistente mueve tu mapa al responder. Para moverlo desde tu código, usa la API de tu biblioteca de mapas.
  • setTheme: solo Chat. Acepta objeto de propiedades CSS personalizadas o una cadena JSON.
  • setStyle: solo Tile. Acepta ID o URL de estilo.
  • destroy: elimina lo añadido por el montaje, detiene renovaciones de sesión y descarta llamadas pendientes. Llamarlo dos veces es inocuo. Un controlador destruido no se reutiliza; monta de nuevo.

Puedes llamar al controlador inmediatamente después de mount. En Viewer y Tile, las llamadas setCamera (y setStyle en Tile) anteriores a que el mapa en el iframe esté listo se guardan y se aplican en orden cuando se recibe kaleidr-embed:ready o la primera posición de cámara que el mapa informa al SDK. Se guardan las últimas 256 llamadas. Si el mapa no indica que está listo dentro del límite, normalmente 10 segundos después de cargarse el iframe, se envían igualmente y aparece una advertencia:

[kaleidr] the map frame has not reported ready — calls held for it are sent now, and may reach no map. The frame may be showing an error (an unpublished map, a blocked request).

La espera comienza al cargarse el iframe. Un iframe nuevo debajo de la zona visible conserva las llamadas hasta que empiece a cargar. No necesitas esperar el mensaje kaleidr-embed:ready para llamar al controlador. Ese mensaje, y kaleidr-embed:error, siguen siendo las señales con las que tu código sabe que el mapa cargó o falló. Consulta Mensajes de Viewer.

El controlador no tiene promesa ready, método on(), ni propiedades map o iframe.

Kaleidr.init()​

Inicializa todos los elementos <kaleidr-map> que ya estén en el documento al llamar. El cargador lo hace automáticamente al ejecutarse y los elementos añadidos después se montan al insertarse, así que casi nunca hace falta. Repetirlo es seguro.

La puerta de activación​

Los elementos incrustados están activados por defecto. La puerta permite detenerlos: si está cerrada, Kaleidr.mount no carga ni envía nada y devuelve un controlador inerte. Se usa para esperar el consentimiento del visitante o desactivar los elementos sin eliminar el HTML.

Los tres controles​

ControlAlcanceCómo establecerlo
Indicador de páginaTodo montaje en la páginawindow.__KALEIDR_EMBED_ENABLED__ = false, establecido antes de los montajes que quieres retener.
Kaleidr.enable()Todo montaje posterior a la llamadaKaleidr.enable(false)
Por montajeUn montajeOpción enabled: false o atributo flag="false"

Cómo decide el montaje​

Cada vez que se monta algo, el SDK consulta los tres controles:

  1. Si alguno está explícitamente en false, se retiene el montaje.
  2. Si no, cuando alguno está explícitamente en true, se realiza.
  3. De lo contrario se aplica el valor predeterminado: activado.

De aquí se desprenden tres consecuencias importantes que pueden confundirse:

  • Un false solo puede liberarse desde el mismo control que lo estableció. Kaleidr.enable(true) no anula enabled: false de un montaje ni un indicador de página en false. Ningún control prevalece sobre otro.
  • La puerta se comprueba solo al montar. Liberar un control no monta automáticamente lo retenido, y desactivar un control no elimina nada que ya esté montado. Tras liberarlo, monta de nuevo con Kaleidr.mount o saca y vuelve a insertar el elemento.
  • El indicador de página se consulta en cada montaje, no solo al cargar el script. Puedes establecerlo después para que afecte al montaje siguiente.
Para liberar la retención deAcción
window.__KALEIDR_EMBED_ENABLED__ = falseAsigna true (o elimina la variable).
Kaleidr.enable(false)Llama a Kaleidr.enable(true) o Kaleidr.enable(null) para recuperar el valor predeterminado.
enabled: false o flag="false"Monta otra vez sin ese valor. Cambiar flag después del montaje no sirve.

Cuando se retiene un montaje, la consola presenta una advertencia que identifica el control:

[kaleidr] embed is disabled — window.__KALEIDR_EMBED_ENABLED__ is false. Reassigning it releases that lever — Kaleidr.enable() cannot.

Valores aceptados​

Los controles son estrictos con los valores booleanos, para evitar que una cadena accidental active los elementos.

ControlSe interpreta como trueSe interpreta como falseIgnorado con advertencia
window.__KALEIDR_EMBED_ENABLED__truefalseTodo valor que no sea booleano real, incluso las cadenas "true" y "false".
Kaleidr.enable(x)sin argumento, true, "true", "1", "yes", "on"false, 0, "", "false", "0", "no", "off"Cualquier otra cadena, undefined, objetos o funciones.
Opción enabledtrue, "true", "1", "yes", "on"false, 0, "", "false", "0", "no", "off"Otras cadenas, objetos o funciones.
Atributo flagflag sin valor, "true", "1", "yes", "on""false", "0", "no", "off"Cualquier otro valor.

La comparación ignora mayúsculas, minúsculas y espacios exteriores. Dos detalles importan al leer valores almacenados:

  • Kaleidr.enable(null) restablece el control al valor predeterminado. No significa «sin preferencia». localStorage.getItem(key) devuelve null si no hay dato, precisamente el estado antes del consentimiento, así que no pases un valor almacenado sin procesarlo. Compáralo primero: Kaleidr.enable(stored === 'true').
  • Un valor ignorado deja el control como estaba: no activa ni desactiva.

Ejemplo: retener los elementos hasta obtener consentimiento​

Esta página retiene todos los elementos con el indicador de página, adecuado porque los elementos se montan en cuanto se ejecuta el cargador. Tras el consentimiento libera el mismo control e inserta los elementos de nuevo.

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Consent-gated map</title>
<script>
// A real boolean, set before the loader. A stored string is compared, never passed through.
window.__KALEIDR_EMBED_ENABLED__ =
localStorage.getItem('embeds-consent') === 'true';
</script>
<script src="https://cdn.kaleidr.com/embed/v1/kaleidr.js"></script>
</head>
<body>
<div id="banner">
This page shows an interactive map from Kaleidr.
<button id="accept">Show the map</button>
</div>

<kaleidr-map product="viewer" share-id="YOUR_MAP_ID"
style="display:block; height:480px"></kaleidr-map>

<script>
const banner = document.getElementById('banner');
if (window.__KALEIDR_EMBED_ENABLED__) banner.hidden = true;

document.getElementById('accept').addEventListener('click', () => {
localStorage.setItem('embeds-consent', 'true');
banner.hidden = true;

// 1. Release the lever that held the embeds.
window.__KALEIDR_EMBED_ENABLED__ = true;

// 2. A held element does not mount by itself. Re-insert each one.
document.querySelectorAll('kaleidr-map').forEach((el) => {
const parent = el.parentNode;
const next = el.nextSibling;
el.remove();
parent.insertBefore(el, next);
});
});
</script>
</body>
</html>

Antes del consentimiento, la pestaña Red muestra kaleidr.js y nada más de Kaleidr: ni paquete de producto, ni solicitud de sesión, ni iframe.

Si montas mediante JavaScript no necesitas puerta: no llames a Kaleidr.mount hasta obtener consentimiento. Es útil cuando el HTML contiene elementos, o un gestor de etiquetas u otro equipo llama a mount y necesitas un interruptor para toda la página:

Kaleidr.enable(false); // hold every later mount
// …
Kaleidr.enable(true); // release it
const handle = Kaleidr.mount('#map', { product: 'viewer', shareId: 'YOUR_MAP_ID' });

Variables globales de página​

Variable globalTipoCuándo se leePara qué sirve
window.__KALEIDR_EMBED_ENABLED__booleanoEn cada montajeIndicador de página de la puerta de activación.
window.__KALEIDR_EMBED_BASE__cadena URLEn cada montajeOrigen de los paquetes en alojamiento propio; solo se usa el origen y debe estar admitido por la sustitución de base. Consulta Versionado de CDN.

Cómo saber si un montaje funcionó​

El SDK no notifica a tu código si está listo o falló. Puedes observar:

ProductoCargadoFallo
viewerEl iframe envía kaleidr-embed:ready.El iframe envía kaleidr-embed:error o la consola muestra un error [kaleidr:viewer].
tileEl iframe envía kaleidr-embed:ready.Una sesión rechazada solo aparece en consola. Un error al dibujar envía kaleidr-embed:error.
chatSin señal. El panel aparece en la página.Solo consola.
editorSin señal. El editor aparece en la página.Solo consola.

Los dos mensajes están explicados en Mensajes de Viewer.

Qué ocurre al fallar un montaje​

CausaQué se muestra¿Solicitud enviada?
El selector no encuentra destino[kaleidr:<product>] mount target not found: <selector>No
El elemento no tiene un product válido[kaleidr] <kaleidr-map> requires product="chat|viewer|editor|tile"No
Se pasó una clave de servidor[kaleidr:<product>] Kaleidr: a server key (kld_sk_…) must never be used in the browser — it is a standing secret. Use your publishable key (kld_pk_…) here and keep the server key server-side.No
Clave desconocida o revocada, u origen prohibidoError CORS del navegador para sessions y después error de solicitud [kaleidr:<product>]. No se renderiza nada.Sí
Falta el scope, la clave está restringida o el plan no admite el producto[kaleidr:<product>] kaleidr session exchange failed (403). No se renderiza nada.Sí
Se agotaron las cargas de mapa de la organización (tile) o hay demasiadas sesiones[kaleidr:<product>] kaleidr session exchange failed (429). No se renderiza nada.Sí
No carga el paquete[kaleidr:<product>] [kaleidr] failed to load https://cdn.kaleidr.com/embed/v1/<product>.jsNo aplicable
Viewer sin ID o con ID incorrecto[kaleidr:viewer] Kaleidr map: invalid id "" — must match ^[A-Za-z0-9._~-]{1,100}$.No
Editor sin clave[kaleidr:editor] [editor-embed] attach() requires an { apiKey }No
Chat sin clave ni shareIdEl panel se muestra pero todas las preguntas fallan.No al montar
La puerta está desactivada[kaleidr] embed is disabled — …No

El SDK nunca muestra el motivo del servidor. Solo registra el estado HTTP de una sesión rechazada. La causa está en el cuerpo de la respuesta: un 403 o 404 pone el código en detail, por ejemplo {"detail":"insufficient_scope"}; un 429 lo pone en error y una frase en detail. La excepción es map_load_quota_exceeded, que aparece en detail. Abre la pestaña Red, selecciona sessions y lee la respuesta. Si CORS oculta el cuerpo, repite la solicitud desde una terminal:

curl -i https://api.kaleidr.com/inference-api/b2b/v1/sdk/sessions \
-H "x-api-key: kld_pk_live_…" \
-H "Origin: https://www.example.com" \
-H "content-type: application/json" \
-d '{"product":"chat"}'
HTTP/2 403
content-type: application/json

{"detail":"origin_not_allowed"}

Usa el origen de la página que falla. Al probar, usa "chat", "editor" o "viewer" como producto: un intercambio "tile" correcto cuenta una carga de mapa. Todos los códigos están descritos en Errores.

Un primer intercambio fallido es definitivo para ese montaje. El SDK no lo reintenta: corrige la causa y vuelve a montar.

Resumen del intercambio de sesión​

Para Chat, Editor y Tile, el SDK nunca usa la clave publicable directamente en la API de ejecución: primero la intercambia por una sesión.

  1. Al montar, el SDK envía POST https://api.kaleidr.com/inference-api/b2b/v1/sdk/sessions, con la cabecera x-api-key: <your publishable key> y el cuerpo {"product":"<product>"}. El navegador agrega el Origin de la página.
  2. Kaleidr comprueba por orden: que la clave sea publicable; que la solicitud tenga origen; que el origen esté en la lista permitida (si existe); que clave y plan admitan el producto; y que la clave tenga el scope correcto: ai para Chat, design para Editor, maps para Tile, ninguno para Viewer.
  3. La respuesta es {"session_token": "…", "expires_in": 900, "product": "…", "basemap_style_id": …}. basemap_style_id es el mapa base predeterminado de la organización, o null si no hay.
  4. El producto utiliza el token de sesión para sus solicitudes, ligado al origen y al producto.
  5. El SDK renueva la sesión 90 segundos antes de expirar, y cuando una pestaña oculta vuelve a estar visible con una sesión próxima a expirar. Si falla la renovación, reintenta cada 30 segundos mientras exista el montaje.
  6. handle.destroy() detiene las renovaciones.

Viewer no necesita sesión. Chat sobre un mapa publicado, montado con shareId y sin clave, obtiene la sesión desde el mapa, no desde la clave. Se explica en Chat en un mapa publicado.

La solicitud y respuesta se especifican en Endpoints. Los tipos de claves, las sesiones y lo que protege (y no protege) una lista de orígenes se explican en el Modelo de seguridad.

Otros mensajes de consola​

MensajeSignificado
[kaleidr] <method>() is not supported on product "<product>" — the call is a no-op. …Llamaste a un método de controlador que el producto no admite.
[kaleidr] <method>() IS supported on product "<product>", but this mount did not expose it, so the call did nothing. …El paquete del navegador en caché es más antiguo que el cargador; vuelve a cargar sin caché.
[kaleidr] the map frame has not reported ready — calls held for it are sent now, and may reach no map. …El mapa de Viewer o Tile no indicó que estaba listo durante la espera descrita en el controlador. Se enviaron igualmente las llamadas setCamera y setStyle. Puede haber un error de marco; escucha kaleidr-embed:error.
[kaleidr] theme must be an object of CSS tokens, not an array; ignored.theme era una matriz.
[kaleidr] theme string must be JSON …; named string themes are not supported. Ignored.theme era una cadena que no empieza con {.
[kaleidr] theme JSON parse failed (…); ignored.theme contenía JSON incorrecto.
[kaleidr] <attribute>="<value>" is not a recognized boolean — the attribute is IGNORED. …La propiedad flag o contained tenía un valor no permitido. La advertencia identifica flag="…" o contained="…".
[kaleidr] base "<value>" is IGNORED — bundles load from <origin>. …La opción o atributo base, o window.__KALEIDR_EMBED_BASE__, señalaba un origen que la sustitución de base no admite. Se usa la CDN predeterminada.
[kaleidr] window.__KALEIDR_EMBED_ENABLED__ must be a boolean; got <type> (…). …El indicador de página no era booleano y se ignoró.
[kaleidr] Kaleidr.enable(): "<value>" is not a recognized boolean — the value is IGNORED. …Kaleidr.enable recibió un valor inutilizable.
[kaleidr] enabled: "<value>" is not a recognized boolean — the value is IGNORED. …La opción enabled recibió un valor inutilizable.
[kaleidr] Kaleidr.enable(undefined) is IGNORED and leaves the gate exactly as it was. …Kaleidr.enable se llamó con undefined.
[kaleidr] Kaleidr.enable(null) RESET the gate to the build default, releasing the <value> set earlier. …Kaleidr.enable(null) anuló un valor anterior.

No disponible​

  • Paquete npm, compilación de módulos ES ni tipos incorporados. Puedes copiar la declaración desde Integración con frameworks.
  • SDK nativo para iOS, Android, React Native o Flutter.
  • Promesa ready, eventos o callbacks del controlador.
  • Cliente JavaScript para llamar a la API sin montar un producto: usa la API de servidor desde el backend.

Relacionado​