使用 Map 缓存 getCapability 响应

问题描述 投票:0回答:1

在我的 JS 应用程序中,我尝试仅缓存我的 WMTS 服务的

getCapabilities
响应。

我有这个函数,但是当使用

baseUrl
对象中完全相同的
layer
调用该函数两次时,无论如何都会发送两次请求。

看起来

Map
对象确实在调用之间被重新初始化。我尝试向该函数添加一个全局计数器,但每次调用时,计数器都停留在 0。

我也愿意尝试除

Map
之外的其他缓存解决方案。

这是我的代码:

const cache = new Map()

export async function getCapabilities(layer, capabilitiesTimeout) {
  const libFetch = require('whatwg-fetch').fetch;
  const url = new URL(layer.views[0]?.baseUrl);
  const cachedRequestId = layer.views[0]?.baseUrl;

  if (!cache.get(cachedRequestId)) {
    const version = layer.views[0].serviceVersion;
    url.searchParams.append('SERVICE', layer.views[0].serviceType);
    url.searchParams.append('REQUEST', 'GetCapabilities');
    url.searchParams.append('VERSION', version);
  
    let response;
    let parsedResponse;
  
    try {
      response = await timeout(capabilitiesTimeout, fetch(getProxiedUrl(url)));
      const text = await response.text();
  
      if (layer.views[0].serviceType === TYPE_WMTS) {
        parsedResponse = parser.read(text);
        cache.set(cachedRequestId, parsedResponse);
      } else if (layer.views[0].serviceType === TYPE_WMS) {
        parsedResponse = parserWms.read(text);
      }
  
      return parsedResponse;
    } catch (e) {
      console.warn(
        `'GetCapabilities' timeout (${capabilitiesTimeout}ms) for layer "${
          layer?.title
        }"`,
        e
      );
    }
  }
  return cache.get(cachedRequestId)
}
javascript caching
1个回答
0
投票

如果

Map
对象被重新初始化;您可以使用 单例设计模式 来确保
cache
仅创建一次并在函数的所有实例之间共享。

您可以简单地创建一个函数,每次调用时都会返回

cache
的相同实例。

// singletonMap.js file
let cache;

export default function getCacheInstance() {
  if (!cache) {
    cache = new Map();
  }
  return cache;
}

您可以在

getCapabilities
函数中使用:

import getCacheInstance from './singletonMap';

export async function getCapabilities(layer, capabilitiesTimeout) {
  const cache = getCacheInstance();
  ...
}
© www.soinside.com 2019 - 2024. All rights reserved.