Можно начать использовать
composables. В примере из vueuse взял, можно и самому реализовать
refDebounced
useAsyncState
import { refDebounced, useAsyncState } from '@vueuse/core';
import { onWatcherCleanup, ref, watch } from 'vue';
async function suggest(place: string, opts?: RequestInit) {
const response = await fetch(..., opts);
return response.json();
}
const places = useAsyncState<Place[]>(
(dst: string, opts?: RequestInit) => suggest(dst, opts),
[],
{
onError(error: unknown) {
if (error instanceof Error && error.name !== 'AbortError')
console.error('Failed to fetch places:', error);
},
}
);
const destination = ref('');
const debouncedDestination = refDebounced(destination, 100);
watch(debouncedDestination, (dst) => {
const controller = new AbortController();
places.executeImmediate(dst, { signal: controller.signal });
onWatcherCleanup(() => {
controller.abort();
});
});