Skip to content

KeepLatest task

This is the way to create a keepLatest task.

This will run the initial tasks and then, if over the max concurrency will keep the very last instance in a que. You can also provide a max that will dictate the number of task instances that will run initially.

Usage

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

<script lang="ts">
import { task } from '@sheepdog/svelte';
const latestTask = task.keepLatest(async () => {
// your code
});
</script>

Max concurrency

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

<script lang="ts">
import { task } from '@sheepdog/svelte';
const latestTask = task.keepLatest(
async () => {
// your code
},
{ max: 5 },
);
</script>

The task store

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

Passing props

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).

<script lang="ts">
import { task } from '@sheepdog/svelte';
const latestTask = task.keepLatest(async (id: string) => {
// your code
});
</script>
<button
on:click={() => {
latestTask.perform('42');
}}>perform</button
>

Getting the return value

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

<script lang="ts">
import { task } from '@sheepdog/svelte';
const latestTask = task.keepLatest(async () => {
return 42;
});
</script>
<button
on:click={() => {
const number = await latestTask.perform();
console.log(number); // 42
}}>perform</button
>

Getting the TaskInstance

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 a svelte store and you can access the current value with instance.get().

<script lang="ts">
import { task } from '@sheepdog/svelte';
const latestTask = task.keepLatest(async () => {
// your code
});
</script>
<button
on:click={() => {
const lastRun = latestTask.perform();
console.log(lastRun.get()); // { isRunning: true, hasStarted: true, ... }
lastRun.cancel();
}}>perform</button
>