RetrySafeMutation
interfaz Desde 1.2.0
Lo que añade retrySafe a una mutación. mutate(input) guarda la intención antes de enviarla
con una clave de idempotencia nueva y rechaza con un error MUTATION_UNCERTAIN mientras haya
otra intención incierta con la misma clave de almacenamiento: resuélvala antes con retry() o
discard().
- Sin respuesta (fallo de red,
5xx,408o429): la intención se conserva,uncertainla muestra ymutaterechaza con el error. Se reintenta con la misma clave al volver la conexión (eventoonline), al montarse un componente que la usa (también tras recargar) o conretry(). Cada reintento vuelve a ponererrorennullmientras está en curso. - Con respuesta: un
2xxla borra y resuelve con la salida; otro4xxla borra y rechaza con suClientError, que también queda enerror.uncertainvuelve anullen la misma actualización quedataoerror. onSuccessyonErroravisan también de los reintentos automáticos.- Nunca se envía en SSR ni en una pasada en seco.
import type { RetrySafeMutation } from "@meekojs/meeko/framework";Código fuente src/app/runtime/mutations.ts:190
Declaración #
interface RetrySafeMutation<Input, Output> {
readonly uncertain: ReadonlySignal<UncertainMutation<Input> | null>
retry(): Promise<Output | undefined>
discard(): void
}Parámetros de tipo #
-
Input Entrada de la mutación.
-
Output Salida de la mutación.
Ejemplo #
<script lang="ts">
const charge = useRpcMutation("sales.checkout", { retrySafe: { key: "pos:sale" } });
function discard(): void {
if (window.confirm("Descártala sólo si comprobaste que no se registró.")) charge.discard();
}
</script>
<template>
<div role="alert" if:when="charge.uncertain.value">
<p>Venta en verificación: se reintentará con la misma clave, sin cobrar dos veces.</p>
<button bind:disabled="charge.pending.value" on:click="() => charge.retry().catch(() => {})">Reintentar</button>
<button on:click="discard">Descartar</button>
</div>
</template>Miembros #
uncertain
#
readonly uncertain: ReadonlySignal<UncertainMutation<Input> | null>La intención enviada sin respuesta, o null. Mientras se reintenta conserva su valor.
retry
#
retry(): Promise<Output | undefined>Reenvía la intención incierta con la misma clave de idempotencia. Resuelve con la salida, con
undefined si no hay ninguna, o rechaza con el error del intento.
discard
#
discard(): voidOlvida la intención incierta sin reenviarla y vacía error; pida antes confirmación al usuario.
Véase también #
- Mutaciones seguras ante reintentos Framework full-stack