Skip to content

JavaScript/TypeScript 批处理流程管理包推荐

摘要:针对需要在浏览器环境中实现流程控制(开始、暂停、继续、中止、重启)、批次管理和持久化存储的需求,本文推荐几个最适合的技术方案,包括 xstate 状态机、IndexedDB 持久化等解决方案。

我需要的是这些功能:流程的开始、暂停、继续、中止、重启等;还可以设置每一批次的任务数量。我要在浏览器里使用,并且这些流程都是持久化的,关闭网页或程序之后重新打开还能恢复。


根据你的需求(浏览器环境、持久化、流程控制、批次管理),以下是几个最适合的解决方案:


1. Workflow Engine + IndexedDB 持久化

推荐组合:xstate + idb-keyval

方案特点

  • xstate:强大的状态机/工作流引擎,支持:
    • 流程的开始、暂停、继续、中止、重启
    • 复杂流程建模(状态、事件、条件分支)
    • 可视化调试工具 (Stately.ai)
  • idb-keyval:轻量级 IndexedDB 封装,用于持久化状态。
  • 批次控制:通过 xstate 上下文管理当前批次任务数量。

示例代码

typescript
import { createMachine, assign } from 'xstate';
import { get, set } from 'idb-keyval';

// 定义流程状态机
const batchMachine = createMachine({
  id: 'batch',
  initial: 'idle',
  context: {
    batchSize: 10, // 每批任务数量
    completed: 0, // 已完成任务数
    tasks: []     // 任务列表
  },
  states: {
    idle: { on: { START: 'running' } },
    running: {
      on: {
        PAUSE: 'paused',
        NEXT_BATCH: {
          actions: assign({
            completed: (ctx) => ctx.completed + ctx.batchSize
          })
        },
        FINISH: 'done'
      }
    },
    paused: { on: { RESUME: 'running', ABORT: 'idle' } },
    done: { type: 'final' }
  }
});

// 持久化状态到 IndexedDB
let currentState = await get('batch-state') || batchMachine.initialState;

const service = interpret(batchMachine)
  .onTransition((state) => {
    set('batch-state', state); // 状态变化时自动保存
  })
  .start(currentState);

// 控制流程
service.send('START');
service.send('PAUSE');
service.send('RESUME');

2. 专用批处理库 + Redux 持久化

推荐组合:p-queue + redux-persist

方案特点

  • p-queue:支持任务队列的并发控制(批次数量)、暂停/继续。
  • redux-persist:将状态持久化到 IndexedDB/LocalStorage。
  • 适合需要精细控制任务队列的场景。

示例代码

typescript
import PQueue from 'p-queue';
import { persistStore, persistReducer } from 'redux-persist';
import storage from 'redux-persist-indexeddb-storage';

// 定义 Redux 状态
const queue = new PQueue({ concurrency: 5 }); // 每批5个任务

// 持久化配置
const persistConfig = {
  key: 'root',
  storage: storage('myDB'),
};
const persistedReducer = persistReducer(persistConfig, rootReducer);

// 控制队列
queue.pause();    // 暂停
queue.start();    // 继续
queue.clear();    // 中止
queue.addAll(tasks); // 重启

3. 轻量级方案:temporal + IndexedDB

如果流程较简单,可以使用:

  • temporal:管理时间与状态快照。
  • 直接操作 IndexedDB 存储任务状态。

对比总结

方案适用场景优点缺点
xstate + IDB复杂流程、严格状态控制可视化调试、高可维护性学习曲线较陡
p-queue + Redux任务队列、简单批次管理轻量、易集成流程逻辑需自行实现
temporal时间敏感的批处理简单直接功能较基础

推荐选择

如果你的流程需要状态逻辑(如条件分支、回滚),选 xstate
如果只是任务队列+批次控制,选 p-queue + Redux 持久化

需要更详细的某方案实现吗?