Computed воркера
useWorkerComputed() (vue-worker-kit/computed) — computed(), который пересчитывается внутри воркера при каждом изменении своего реактивного источника, с автоматическим отбрасыванием устаревших запусков.
import { useWorkerComputed } from 'vue-worker-kit/computed'
const sorted = useWorkerComputed<typeof import('./heavy-sort.worker')>(
() => new Worker(new URL('./heavy-sort.worker.ts', import.meta.url), { type: 'module' }),
() => list.value, // отслеживается как источник watchEffect
{ debounce: 150 },
)
// sorted.value — undefined до первого результата, затем последний АКТУАЛЬНЫЙ результат
// sorted.isRunning, sorted.errorОбработка гонок: каждый запуск получает внутренний номер поколения. Если источник меняется снова до прихода результата запуска, этот результат просто отбрасывается по прибытии (никогда не откатывает sorted.value к устаревшему значению), а ctx.signal вытесненного запуска отменяется (кооперативно — обработчик сам решает, проверять его или нет).
Параметры
factory
() => Worker
Та же фабрика воркера, что и у useWorker().
source
() => In
Отслеживается как источник watchEffect — перезапускает воркер при каждом изменении любой реактивной зависимости, прочитанной внутри него.
options
debounce
number
Задержка в мс перед запуском воркера при изменении источника — предотвращает запуск на каждый реактивный тик (например, на каждое нажатие клавиши).
Возвращаемое значение
sorted выше — объект, похожий на ShallowRef:
value
Out | undefined
undefined до прихода первого результата, затем всегда последний неустаревший результат.
isRunning
ComputedRef<boolean>
error
ShallowRef<WorkerError | null>
У useWorkerComputed() нет опции cache — её собственный механизм номеров поколений уже отбрасывает устаревшие/вытесненные результаты, а её source() обычно выдаёт новый вход на каждом реактивном тике в любом случае, так что мемоизация по ключу мало на чём сработала бы.