Skip to content

Debounce

Type Definition

typescript
debounce?:
  | number  // Simple delay time (milliseconds)
  | {
      wait: number;          // Delay time (milliseconds)
      options?: {
        leading?: boolean;   // Whether to execute before the delay starts
        maxWait?: number;    // Maximum wait time
        trailing?: boolean;  // Whether to execute after the delay ends
      };
    };

Return Value Notes

Important Notes

  • After setting debounce, execute() no longer returns a Promise
  • Use promise$.then() to handle request results
  • Use reactive states like data, error, loading to get results
ts
const { execute, promise$, data, loading, error } = useFetch(url, {
  immediate: false,
  debounce: 300,
});

// ❌ Wrong usage - execute doesn't return Promise
// const result = await execute();

// ✅ Correct usage - use promise$
promise$.then((result) => {
  console.log("Request successful:", result);
});

// ✅ Or use reactive states
watch(data, (newData) => {
  if (newData) {
    console.log("Data updated:", newData);
  }
});

execute(); // Trigger debounced request

Examples

Basic Usage

Control useFetch debounce behavior through the debounce parameter to avoid frequent request triggers:

ts
const { execute } = useFetch(url, {
  immediate: false,
  debounce: 300, // 300ms debounce
});

// Rapid consecutive calls, only the last one will execute
execute();
execute();
execute(); // ✅ Only this one will execute after 300ms

leading: Leading Edge Trigger

ts
// leading: true - Execute immediately on first call
const { execute } = useFetch(url, {
  immediate: false,
  debounce: {
    wait: 300,
    options: { leading: true, trailing: false },
  },
});

execute(); // ✅ Execute immediately
execute(); // ❌ Cancelled by debounce
execute(); // ❌ Cancelled by debounce

trailing: Trailing Edge Trigger

ts
// trailing: true - Execute after delay on last call (default behavior)
const { execute } = useFetch(url, {
  immediate: false,
  debounce: {
    wait: 300,
    options: { leading: false, trailing: true },
  },
});

execute(); // ❌ Cancelled by subsequent calls
execute(); // ❌ Cancelled by subsequent calls
execute(); // ✅ Execute after 300ms

maxWait: Maximum Wait Time

ts
const { execute } = useFetch(url, {
  immediate: false,
  debounce: {
    wait: 300,
    options: { maxWait: 1000 },
  },
});

// Even with continuous calls, will force execute once at 1000ms

Combined with Other Options

Combined with refetch

ts
const query = ref("");

const { data } = useFetch("/api/search", {
  debounce: 300, // Debounce delay
  refetch: true, // Reactive updates
  condition: () => query.value.length > 2, // Condition restriction
})
  .get(() => ({ q: query.value }))
  .json();

Combined with retry

ts
const { execute } = useFetch("/api/data", {
  immediate: false,
  debounce: 500, // Debounce
  retry: 3, // Retry on failure
  onFetchError: ({ error }) => {
    console.error("Request failed:", error);
  },
});