/** * 详情数据加载:接口优先,缓存兜底 * * 列表页跳转时会 `uni.setStorageSync('xxxDetail', row)`,但列表行只有列表列字段, * 附件、子表、归档情况这些只有详情接口才有。若编辑页先读缓存就回填表单, * 提交时会把缺失的附件一并清空(数据丢失)。 * * 所以统一走「先请求详情接口,失败时才用缓存兜底」,缓存只用于接口不可用时的降级。 */ /** * @param {object} options * @param {string} options.cacheKey 列表页写入的 storage key * @param {string} options.id 当前记录 id * @param {Function} options.fetcher 接收 id、返回 Promise 的详情接口 * @returns {Promise} 详情对象,取不到返回 null */ export async function loadDetailData({ cacheKey, id, fetcher }) { const cached = cacheKey ? uni.getStorageSync(cacheKey) : null; const fallback = cached && String(cached.id) === String(id) ? cached : null; try { const res = await fetcher(id); return res?.data || fallback || null; } catch (error) { if (fallback) return fallback; throw error; } }