useAsyncQueue.ts
660 Bytes
import { ref, watchEffect } from 'vue';
export function useAsyncQueue() {
  const queue: Fn<any, Promise<any>>[] = [];
  const executeFlag = ref(false);
  const setTask = (fn: Fn<any, Promise<any>>) => {
    queue.push(fn);
  };
  const removeTask = (fn: Fn<any, Promise<any>>) => {
    const index = queue.findIndex((item) => item === fn);
    ~index && queue.splice(index, 1);
  };
  const clearTask = () => {
    queue.length = 0;
  };
  watchEffect(() => {
    if (executeFlag.value) {
      queue.forEach((item) => item());
      executeFlag.value = false;
      clearTask();
    }
  });
  return { setTask, removeTask, clearTask, executeFlag };
}