# Retry
Retry
# State
The useRetry
function exposes the following reactive state:
import { useRetry } from "vue-composable"; const { retryCount, nextRetry, isRetrying, retryErrors } = useRetry();
State | Type | Description |
---|---|---|
retryCount | Number | Current attempt number |
nextRetry | Number | When it should retry, new Date(nextRetry.value) |
isRetrying | Boolean | Get the current state, set to true after the first failure |
retryErrors | Array<any> | List of all the errors occurred in since the last exec call |
# Methods
The useRetry
function exposes the following methods:
import { useRetry } from "vue-composable"; const { cancel, exec } = useRetry();
Signature | Description |
---|---|
cancel | Stops the retrying |
exec(fn?) | executes function or the factory provided |
# Example
current Id 1
Status:
# Code
<template> <div> <p>current Id {{ id }}</p> <p> <button @click="id--">prev</button> <button @click="id++">next</button> </p> <div> <label for="throwError">Throw error</label> <input type="checkbox" name="throwError" v-model="throwError" /> </div> <div> <label for="retryMode">Retry mode:</label> <select name="retryMode" v-model="mode"> <option value="delay">Delay</option> <option value="backoff">Exponential backoff</option> </select> </div> <div v-if="mode === 'delay'"> <label for="delay">Delay</label> <input type="number" name="delay" v-model.number="delay" /> </div> <p v-if="loading">loading...</p> <p v-else-if="isRetrying"> retrying in {{ Math.floor(nextRetry - dateNow) }}ms <span>Current: {{ retryCount }} retries</span> </p> <div v-else> <p>Status: {{ status }}</p> <span>{{ json }}</span> </div> </div> </template> <script> import { ref, watch } from "@vue/composition-api"; import { useFetch, useRetry, exponentialDelay } from "vue-composable"; export default { name: "retry-example", setup() { const id = ref(1); const throwError = ref(false); const delay = ref(200); const dateNow = ref(Date.now()); const mode = ref("delay"); const retryDelay = n => { switch (mode.value) { case "delay": return delay.value; case "backoff": return exponentialDelay(n); } }; const { json, loading, exec: fetchExec, error, status } = useFetch(); const { isRetrying, nextRetry, retryCount, exec } = useRetry({ retryDelay }); watch(id, id => { exec(() => { if (throwError.value) { throw new Error("blocked"); } return fetchExec(`https://reqres.in/api/user/${id}`); }); }); // just to have a nice countdown setInterval(() => (dateNow.value = Date.now()), 10); return { id, json, loading, status, retryCount, delay, mode, throwError, isRetrying, nextRetry, dateNow }; } }; </script>