Skip to content

Restart task

This is the way to create a restartable task.

This will cancel the oldest instance of the task and start a new instance of it. You can also provide a max that will only restart the oldest task instance if the threshold is exceeded.

To specify a task as restartable, you can either use the dot notation or the options notation.

import { task } from '@sheepdog/vanilla';
const restartTask = task.restart(async () => {
// your code
});

This is how you can specify the maximum number of concurrent instances. The default is 1, here we’re setting it to 5.

import { task } from '@sheepdog/vanilla';
const restartTask = task.restart(
async () => {
// your code
},
{ max: 5 },
);

The return value of the task function will be an object with getters where you can access state from all the instances running and eventually cancel them with cancelAll.

While defining a task, if the function that you pass in has some arguments, those will be required by the perform function (and it will be strongly typed too).

import { task } from '@sheepdog/vanilla';
const restartTask = task.restart(async (id: string) => {
// your code
});
button.addEventListener('click', () => {
restartTask.perform('42');
});

If you return something from your task you can access the return value by awaiting the perform function.

import { task } from '@sheepdog/vanilla';
const restartTask = task.restart(async () => {
return 42;
});
button.addEventListener('click', () => {
const number = await restartTask.perform();
console.log(number); // 42
});

If you don’t await the perform function, then you’ll get back the task instance that you can use either to cancel it or to get its current state. The TaskInstance is also an object with getters you can access the current value with instance.value or register events on it with instance.on.

import { task } from '@sheepdog/vanilla';
const restartTask = task.restart(async () => {
// your code
});
button.addEventListener('click', () => {
const lastRun = restartTask.perform();
lastRun.on('success', () => {
console.log(lastRun.value);
});
lastRun.cancel();
});