5月30日 01:39
如何在 Zustand 中处理异步操作?
Zustand 处理异步不需要额外机制,直接在 action 里写 async/await,用 set 更新 loading/data/error,需要最新状态时用 get()。如果是服务端缓存、重试、失效刷新这类问题,优先交给 React Query 或 SWR,Zustand 只保存跨页面共享的 UI 或业务状态。
追问
async action 里为什么要用 get()?
异步代码执行时,闭包里的旧值可能已经过期。get() 读取的是当前 store 状态,适合在 await 后继续基于最新状态更新。
loading 和 error 应该怎么设计?
简单请求可以放 loading: boolean;多个并发请求最好按 key 存状态,避免 A 请求结束把 B 请求的 loading 误关掉。
Promise 链和 async/await 有区别吗?
能力上差不多。面试回答用 async/await 更清楚,但要说明 action 可以返回 Promise,组件或测试里可以继续 await。
什么时候不该把请求全塞进 Zustand?
需要缓存、分页、去重、后台刷新、请求取消时,不要自己造一套数据请求框架,直接用 React Query/SWR 更稳。
写段代码
javascriptconst useStore = create((set, get) => ({ user: null, loading: false, error: null, fetchUser: async (id) => { set({ loading: true, error: null }); try { const user = await fetch(`/api/users/${id}`).then(r => r.json()); set({ user, loading: false }); } catch (e) { set({ error: e.message, loading: false }); } } }));