Files
zhuangang/topics/frontend/react/examples/task-panel/taskReducer-demo.ts
T

22 lines
1.3 KiB
TypeScript

// 运行:node taskReducer-demo.ts —— 验证乱序 / 重复 / 迟到事件被丢弃,失败后可重试
import { initialState, taskReducer, type TaskEvent } from "./taskReducer.ts";
const events: TaskEvent[] = [
{ type: "submitted", id: "T1" },
{ type: "progress", seq: 1, step: "查询数据", done: false },
{ type: "progress", seq: 2, step: "查询数据", done: true },
{ type: "progress", seq: 1, step: "查询数据", done: false }, // 重连后收到的旧事件:丢弃
{ type: "progress", seq: 3, step: "生成图表", done: true },
{ type: "succeeded", seq: 4, result: { title: "9 月报表", url: "/reports/9" } },
{ type: "failed", seq: 5, error: "迟到的失败事件", retryable: false }, // 终态之后:丢弃
];
const final = events.reduce(taskReducer, initialState);
console.log(final.status, final.steps, final.result);
if (final.status !== "succeeded" || final.steps.length !== 2 || !final.steps.every((x) => x.done)) {
throw new Error("断言失败");
}
const failed = [{ type: "submitted", id: "T2" }, { type: "failed", seq: 1, error: "超时", retryable: true }, { type: "retry" }]
.reduce((st, ev) => taskReducer(st, ev as TaskEvent), initialState);
if (failed.status !== "queued" || failed.error !== null) throw new Error("断言失败");
console.log("重试后:", failed.status);