uni.setStorage和uni.getStorage是异步接口,需回调或Promise获取结果;uni.setStorageSync和uni.getStorageSync是同步接口,立即返回但阻塞主线程,核心差异在于存储完成时机确认方式。

uni.setStorage 和 uni.getStorage 是异步接口,必须靠回调或 Promise 包装才能拿到结果;uni.setStorageSync 和 uni.getStorageSync 是同步接口,调用后立即返回值或抛错,但会阻塞 JS 主线程。
uni.setStorage 与 uni.setStorageSync 的核心差异
关键不在“能不能存”,而在“什么时候能确认存完”:
-
uni.setStorage是异步的:写入操作提交后函数立刻返回,实际存储可能几毫秒后才完成,必须在success回调里处理后续逻辑(比如跳转、更新 UI) -
uni.setStorageSync是同步的:调用后会卡住 JS 执行,直到数据真正落盘才继续——对小数据(如 token、开关状态)影响不大,但存大对象(如缓存整页列表)可能明显卡顿 - 两者都要求
data必须是可序列化的值;若传入函数、undefined、Symbol 或循环引用对象,setStorageSync会静默失败(返回 undefined),setStorage则在fail回调中报JSON.stringify error - 小程序平台(微信、支付宝等)对
setStorageSync有更严的单次写入大小限制(通常 ≤ 1MB),超限直接抛错;H5 环境下则依赖浏览器 localStorage 限制(一般 5–10MB)
uni.getStorage 读取时为什么常遇到 undefined?
不是没存进去,而是读得太早或 key 不匹配:
- 用
uni.setStorage存完立刻调uni.getStorage,不等success就读,大概率读到旧值或空值——因为写还没完成 - key 大小写敏感,
'Token'和'token'是两个键;存的时候用了对象包装(如{key: 'user', data: obj}),读的时候却漏了key字段,导致参数错误 -
uni.getStorageSync查不到时直接返回undefined,不会报错;容易误判为“没存”,其实是 key 写错或跨平台清缓存(比如微信开发者工具点了“清除数据”) - 某些安卓 WebView 对
JSON.parse容错差,如果之前存的是非法 JSON 字符串(比如手动拼接过),getStorageSync可能静默返回undefined,而getStorage会在fail中提示解析失败
何时该用同步,何时必须用异步?
别凭感觉选,看执行时机和数据重要性:
- 登录态 token、用户基础信息这类**启动即需、不可为空**的数据,建议用
uni.getStorageSync同步读取,避免白屏等待;但存 token 时用uni.setStorageSync要加 try/catch,防止因序列化失败导致静默丢失 - 页面级缓存(如搜索历史、表单草稿)、非关键配置,优先用
uni.setStorage+uni.getStorage,配合fail回调降级(比如 fail 时走默认值) - 连续多次写入(如批量保存 10 条日志),不要连写多个
setStorageSync,改用Promise.all包裹多个setStorage,否则主线程会被锁死数秒 - 调试时想快速验证 key 是否存在,直接在控制台敲
uni.getStorageSync('xxx')最快;但上线代码里别这么干,尤其不能在 onLaunch 里无条件同步读多个 key,iOS 小程序可能触发性能告警
最易被忽略的一点:所有 storage 接口在不同平台行为一致,但**容量上限和错误提示粒度差异极大**。微信小程序里 setStorageSync 超 1MB 直接 throw,H5 里可能只是静默截断。真要存大结构,先 JSON.stringify 测长度,再决定分片还是换 IndexedDB。


















