在我的 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)
}
如果
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();
...
}