gaoluyang
2 小时以前 e449a5408265e4bd1f6c66f5be28a42efac444ee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
 * 详情数据加载:接口优先,缓存兜底
 *
 * 列表页跳转时会 `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<object|null>} 详情对象,取不到返回 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;
  }
}