异步 Action、竞态与服务端状态边界:练习答案
测试不需要真实网络,只要保留每次请求的 resolve:
ts
const pending: Record<string, (value: string[]) => void> = {}
const fetchResults = (keyword: string) => new Promise<string[]>((resolve) => { pending[keyword] = resolve })
const oldTask = search('old')
const newTask = search('new')
pending.new(['new-result'])
await newTask
pending.old(['old-result'])
await oldTask
console.assert(state.items[0] === 'new-result')若使用 AbortController,catch 分支先判断 signal.aborted,将状态回到 idle 或保留上一份成功数据;只有非取消错误才进入 error。这样测试同时证明了顺序保护和用户可见状态没有把取消当故障。
答案只用于对照;请把自己的输入、输出和边界记录到项目实验日志中。