2.0.0 • Published 5 months ago

@flowsydev/vue-task v2.0.0

Weekly downloads
-
License
-
Repository
-
Last release
5 months ago

Flowsy Vue Task

Run async actions and keep track of their execution state and results in your Vue applications. Your async actions can be as simple as an iteration through some array elements or as complex as your business logic including backend calls.

Install

npm install --save @flowsydev/vue-task

Usage

<script setup lang="ts">
import { toRefs } from "vue";
import useTask from "@flowsydev/vue-task";

////////////////////////////////////////////////////////////
// Action required: sum numbers from 'start' to 'end'
////////////////////////////////////////////////////////////

// Action argument type
interface SumArgument {
  start: number;
  end: number;
}

// Action
function sum(argument: SumArgument): Promise<number> {
  return new Promise<number>((resolve, reject) => {
    let s = 0;
    for (let i = argument.start; i <= argument.end; i++) {
      s += i;
    }
    // Simulate time-consuming task
    setTimeout(() => {
      // Simulate error
      if (s % 2 !== 0) reject(new Error(`Invalid sum: ${s}`));
      resolve(s);
    }, 2000);
  });
}

// Prepare task
const task = useTask<SumArgument, number>(
  sum,
  {
    tag: "SumNumbers",
    createArgument: () => ({ start: 0, end: 0 }), // Create initial argument
    canExecute: (a: SumArgument) => (a && (a.end > a.start)) || false  // Optional validation
  });

// Available properties and functions
const {
  argument, // SumArgument
  execute, // sum(argument)
  isExecuting, // boolean
  isCompleted, // boolean
  isFailed, // boolean
  result, // number
  error // any
} = toRefs(task);
</script>

<template>
  <div>
    <template v-if="argument">
      <div>
        <label for="start">Start:&nbsp;&nbsp;</label>
        <input v-model="argument.start" name="start" type="number">
      </div>
      <div>
        <label for="end">End:&nbsp;&nbsp;</label>
        <input v-model="argument.end" name="end" type="number">
      </div>
    </template>
    <div>
      <button :disabled="isExecuting" @click="execute()">Execute</button>
    </div>
    <div v-if="isExecuting">
      Executing...
    </div>
    <div v-else-if="isCompleted" style="color: green;">
      Sum = {{ result }}
    </div>
    <div v-else-if="isFailed" style="color: red;">
      {{ error.message }}
    </div>
    <hr style="margin-top: 2rem; margin-bottom: 2rem;">
    <pre>{{ task }}</pre>
  </div>
</template>
2.0.0

5 months ago

1.0.0

5 months ago

0.1.8-dev

10 months ago

0.1.9-dev

10 months ago

0.1.7-dev

1 year ago

0.1.6-dev

1 year ago

0.1.5-dev

1 year ago

0.1.4-dev

1 year ago

0.1.3-dev

1 year ago

0.1.2-dev

1 year ago

0.1.1-dev

1 year ago

0.1.0-dev

1 year ago