Saltar al contenido

Qué es invoke, de verdad

Una función de JavaScript que devuelve una promesa y ejecuta código nativo. Qué la separa de una llamada normal, por qué siempre es asíncrona aunque el comando no lo sea, y el modelo mental correcto: no es una llamada, es un mensaje.

Llamada frente a mensaje

JS
// esto es una llamada a funciónconst r = calcular(42);// esto parece lo mismo y no lo esconst r = await invoke('calcular', { valor: 42 });

Las diferencias no son de sintaxis:

Por qué siempre es una promesa

Aunque el comando de Rust sea una función síncrona que devuelve un número al instante, invoke devuelve una promesa. No es una decisión de estilo: el mensaje tiene que salir del hilo de JavaScript, cruzar a otro proceso y volver, y eso no puede ocurrir dentro de una vuelta del bucle de eventos.

De ahí una consecuencia práctica que conviene interiorizar pronto: no existe la versión síncrona. Cualquier interfaz que necesite un dato del core tiene que estar preparada para el momento en que ese dato todavía no ha llegado. Si tu componente asume que puede leer un valor y pintarlo en la misma vuelta, ese componente no encaja con Tauri y hay que darle un estado de carga.

Las tres consecuencias

Uno · el coste. Cruzar cuesta. No mucho para una llamada, y multiplicado por cientos por segundo, sí. Un invoke dentro de un manejador de teclado, de un evento de ratón o de un bucle de pintado es el patrón que hunde el rendimiento de una aplicación de Tauri, y es fácil de escribir sin darse cuenta. El nivel 13.4 lo mide y el 21 da los patrones para evitarlo.

Dos · la forma. Lo que cruza tiene que tener una representación en JSON, y esa representación es un contrato entre los dos lados. Hoy lo mantienes a mano en dos sitios; el nivel 19 lo genera desde uno solo.

Tres · el fallo. Un mensaje puede no llegar, puede ser rechazado, puede llegar y fallar. El frontend necesita distinguir esos casos, y para eso el error tiene que traer algo más que una frase. Nivel 18.

Qué cruza por aquí

Merece la pena tener presente la magnitud: todo lo que tu frontend no puede hacer solo pasa por este canal. Abrir un fichero, guardar en la base de datos, leer una credencial, lanzar un proceso, hablar con una API con un token, saber en qué monitor está la ventana.

Es decir, invoke no es una utilidad más del framework: es la única superficie. Por eso la fase III son nueve niveles, y por eso la fase V se dedica entera a controlar quién puede usarla.