# Web Worker API
# Parameters
import { useWorker } from "vue-composable";
useWorker(stringUrl, args?, options?);
Parameters | Type | Required | Default | Description |
---|---|---|---|---|
stringUrl | String|URL | true | Webworker file path | |
args | any|any[] | false | undefined | arguments for the first message sent to the worker |
options | Options | false | undefined | Documentation (opens new window) |
# State
The useWorker
function exposes the following reactive state:
import { useWorker } from "vue-composable";
const { worker, data, terminated, errorEvent, errored } = useWorker();
State | Type | Description |
---|---|---|
worker | Worker | Worker instance |
data | Ref<any> | Last message received by the worker |
terminated | Ref<boolean> | Has worker being terminated |
errorEvent | Ref<any> | Last event received on 'error' message |
errored | Ref<boolean> | Has error occurred |
# Methods
The useWorker
function exposes the following methods:
import { useWorker } from "vue-composable";
const { postMessage, terminate } = useWorker();
Signature | Description |
---|---|
postMessage | PostMessage to the worker |
terminate | Terminates the worker |
# Inside the worker
Inside of worker you can use the exposeWorker
, it will post the result and execute the method when receiving the message.
// super.worker.js
import { exposeWorker } from "vue-composable";
const max = numbers => Math.max(...numbers);
exposeWorker(max);
TIP
exposeWorker
you can use yield
to sending a stream of data to the main thread
# Example
Sort
time: 1634454087211
The worker can take more than 10 seconds to finish, the timer shouldn't stop while the worker is processing
Numbers: []... []
# Code
You can find the worker
used in this example at worker.example.js (opens new window)
// worker.example.js
import { exposeWorker } from "vue-composable";
function* bubbleSort(input) {
let swap;
let n = input.length - 1;
const sortedArray = input.slice();
yield ["sorting", `${input.length} items`];
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;
if (Math.floor(input.length / 2) === n) {
yield ["sorted", `${n} items processed`];
}
} while (swap);
yield sortedArray;
}
exposeWorker(bubbleSort);
<template>
<div>
<h3>Sort</h3>
<p>time: {{ now }}</p>
<h6>
The worker can take more than 10 seconds to finish, the timer shouldn't
stop while the worker is processing
</h6>
<p>
Numbers:
<b>{{ firstSegment }}</b
>...
<b>{{ lastSegment }}</b>
</p>
<ul>
<li>
<button @click="sortWorker">Worker</button>
<p v-if="errored" :style="{ color: 'red' }">{{ errorEvent }}</p>
</li>
</ul>
</div>
</template>
<script>
import {
defineComponent,
ref,
computed,
watchEffect,
watch
} from "@vue/composition-api";
import { useWorker, useDateNow } from "vue-composable";
export default defineComponent({
name: "worker-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 { postMessage, data, errored, errorEvent } = useWorker(
"/vue-composable/worker.example.js"
);
watch(
data,
d => {
sortedNumbers.value = d;
},
{ lazy: true }
);
watch(
errorEvent,
e => {
sortedNumbers.value = ["error", e.returnValue];
},
{ lazy: true }
);
const sortWorker = () => {
postMessage(numbers);
};
return {
now,
firstSegment,
lastSegment,
sortWorker,
errored,
errorEvent
};
}
});
</script>