export default function createInterceptorRequest()

in packages-fetcher/fetcher-interceptor-cache-local/src/util/create-interceptor-request.ts [19:69]


export default function createInterceptorRequest(): FetcherFnInterceptRequest<IFetcherConfigExtended> {
  return (fetcherConfig: IFetcherConfigExtended): FetcherInterceptRequestReturn<IFetcherConfigExtended> => {
    const cacheLocal = parseOptions(fetcherConfig);
    
    fetcherConfig.cacheLocal = cacheLocal; // 保证 response 拿到的 cacheLocal 是对象或 null
    
    // 不需要 cacheLocal,直接跳过,将继续请求
    if (!cacheLocal) {
      return;
    }
    
    const {
      key
    } = cacheLocal;
    const cache = cacheGet(key);
    
    // 第 0 个请求 - 没有缓存,或缓存已过期
    if (!cache || (cache.ttl > 0 && Date.now() - cache.time > cache.ttl)) {
      cacheAdd(key);
      
      return;
    }
    
    const {
      queue,
      data
    } = cache;
    
    // 1. 第 0 个请求还在请求中,则附之
    if (queue) {
      const promise = new Promise((resolve, reject) => queue.push({
        resolve,
        reject
      }));
      
      throw createFetcherErrorSkipNetwork(promise, fetcherConfig);
    }
    
    // 重新请求的场景,不要和之前的第 0 个请求逻辑合并
    // 1. 指定 overwrite
    // 2. 当前的缓存不会过期,但新的请求设置了过期
    if (cacheLocal.overwrite || (cache.ttl <= 0 && cacheLocal.ttl > 0)) {
      cacheAdd(key);
      
      return;
    }
    
    // 命中缓存
    throw createFetcherErrorSkipNetwork(_cloneDeep(data), fetcherConfig); // 返回 clone 后的数据避免副作用
  };
}