# WebWorker Function

Creates a WebWorker based on a function, useful for offloading heavy tasks easily

The useWorkerFunction function uses CancellablePromise

# Parameters

import { useWorkerFunction } from "vue-composable"; useWorkerFunction(fn, options); interface WebWorkerFunctionOptions { dependencies?: RefTyped<string[]>; timeout?: RefTyped<number>; } 
Parameters Type Required Default Description
fn Function true Function we want to execute in the worker
options WebWorkerFunctionOptions false undefined Options for the webworker

# State

The useWorkerFunction function exposes the following reactive state:

import { useWorkerFunction } from "vue-composable"; const { promise, result, loading, error, cancelled } = useWorkerFunction(); 
State Type Description
promise Promise Current worker process
result any Resolved value
loading boolean Waiting for the worker to finish
error any Promise error
cancelled boolean Was cancelled

# Methods

The useWorkerFunction function exposes the following methods:

import { useWorkerFunction } from "vue-composable"; const { exec, cancel } = useWorkerFunction(); 
Signature Description
exec(args?) Resolves new promise
cancel(error?) Terminates the worker

# Example

Sort

time: 1634454087218

If UI thread is working the refresh rate should go down and the time will stop

Numbers: []... []

# Code

<template> <div> <h3>Sort</h3> <p>time: {{ now }}</p> <div> <label>Size</label> <input v-model.number="size" type="number" /> </div> <div> <label>Timeout</label> <input v-model.number="timeout" type="number" /> </div> <p> Numbers: <b>{{ firstSegment }}</b >... <b>{{ lastSegment }}</b> </p> <ul> <li> <button @click="suffleArray">Function</button> </li> <li> <button @click="suffleWorker" :disabled="working">Worker</button> <p v-if="cancelled" :style="{ color: 'red' }">{{ error }}</p> </li> </ul> </div> </template> <script> <template> <div> <h3>Sort</h3> <p>time: {{ now }}</p> <h6> If UI thread is working the refresh rate should go down and the time will stop </h6> <div> <label>Timeout</label> <input v-model.number="timeout" type="number" /> </div> <p> Numbers: <b>{{ firstSegment }}</b >... <b>{{ lastSegment }}</b> </p> <ul> <li> <button @click="suffleArray">Function</button> </li> <li> <button @click="suffleWorker" :disabled="working">Worker</button> <p v-if="cancelled" :style="{ color: 'red' }">{{ error }}</p> </li> </ul> </div> </template> <script> import { defineComponent, ref, computed, watchEffect } from "@vue/composition-api"; import { useWorkerFunction, useDateNow } from "vue-composable"; const bubbleSort = input => { let swap; let n = input.length - 1; const sortedArray = input.slice(); do { swap = false; for (let index = 0; index < n; index += 1) { if (sortedArray[index] > sortedArray[index + 1]) { const tmp = sortedArray[index]; sortedArray[index] = sortedArray[index + 1]; sortedArray[index + 1] = tmp; swap = true; } } n -= 1; } while (swap); return sortedArray; }; export default defineComponent({ name: "worker-function-example", setup() { const timeout = ref(1500); const { now } = useDateNow({ refreshMs: 10 }); const numbers = [...Array(50000)].map(() => Math.floor(Math.random() * 1000000) ); const sortedNumbers = ref([]); const firstSegment = computed(() => sortedNumbers.value.slice(0, 10)); const lastSegment = computed(() => sortedNumbers.value.slice(-10)); const suffleArray = () => { sortedNumbers.value = bubbleSort(numbers); }; const { exec, loading: working, error, cancelled } = useWorkerFunction(bubbleSort, { timeout }); const suffleWorker = () => { exec(numbers) .then(x => (sortedNumbers.value = x)) .catch(x => (sortedNumbers.value = ["error", x])); }; return { now, timeout, firstSegment, lastSegment, suffleArray, suffleWorker, working, error, cancelled }; } }); </script>