Skip to content

Computed воркера

useWorkerComputed() (vue-worker-kit/computed) — computed(), который пересчитывается внутри воркера при каждом изменении своего реактивного источника, с автоматическим отбрасыванием устаревших запусков.

ts
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() обычно выдаёт новый вход на каждом реактивном тике в любом случае, так что мемоизация по ключу мало на чём сработала бы.