uni.getStorage必须传key,因它是按key精确查找的异步API,不支持模糊匹配或批量读取;漏传会报错“invalid key”,且key区分大小写,动态key需校验非空。

uni.getStorage 为什么必须传 key?
因为 uni.getStorage 是按 key 精确查找,不支持模糊匹配或批量读取。漏传 key 会直接报错 fail: invalid key,且不会 fallback 到默认值。
常见错误写法:uni.getStorage({ success: res => console.log(res.data) }) —— 缺少 key 字段,必然失败。
- 必须显式传入字符串类型的
key,比如'user_token'、'theme_mode' -
key区分大小写,'UserInfo'和'userinfo'是两个不同缓存项 - 如果 key 是动态拼接的(如带用户 ID),务必提前校验非空,避免传入
undefined或空字符串
异步读取失败时,fail 回调里能拿到什么?
失败原因五花八门,但 fail 回调只返回一个对象,常见字段有 errCode 和 errMsg。最典型的是 errCode: 10001(对应 errMsg: "the key does not exist in storage"),表示 key 不存在——这不是异常,是正常业务流的一部分。
- 不要在
fail里无条件 throw 错误,否则可能中断后续逻辑 - 建议统一处理:key 不存在时返回默认值,而非报错;只有网络层或系统级错误(如
errCode: -1)才需记录日志 - H5 端可能因 localStorage 被禁用而触发
errCode: 10002,此时应降级为内存缓存
想链式读多个 key,能直接 await 吗?
不能。原生 uni.getStorage 不返回 Promise,直接 await uni.getStorage(...) 会得到 undefined。
正确做法是用 uni.promisify 封装,或者手写 Promise 包一层:
const getStorage = uni.promisify(uni.getStorage);
// 或
const getStorage = (key) => new Promise((resolve, reject) => {
uni.getStorage({
key,
success: res => resolve(res.data),
fail: err => reject(err)
});
});
- 封装后可
await getStorage('token'),也支持Promise.all([getStorage('a'), getStorage('b')]) - 注意:小程序端
uni.promisify兼容性良好;App 端需确认基座版本 ≥ 3.2.0 - 频繁读多个 key 时,别盲目并发——iOS 微信小程序对连续 Storage 调用有隐式节流,串行反而更稳
读取大对象(如 Base64 图片)时卡顿怎么办?
不是“读得慢”,而是同步反序列化 JSON 占用主线程。尤其在低端安卓机上,一个 500KB 的 Base64 字符串解析可能阻塞 UI 达 200ms 以上。
- 根本解法:不存大对象。把图片上传到 CDN,缓存的是 URL 而非原始数据
- 若必须存,改用
uni.getStorageSync+ Web Worker(仅 App/H5 支持),但微信小程序不支持 Worker 访问 storage - 临时缓解:加 loading 遮罩,或用
setTimeout把解析逻辑延后到下一帧,避免卡死交互


















