mirror of
https://github.com/kmc7468/arkvault.git
synced 2026-02-04 08:06:56 +00:00
홈, 갤러리, 캐시 설정, 썸네일 설정 페이지에서의 네트워크 호출 최적화
This commit is contained in:
@@ -17,7 +17,7 @@ export class FilesystemCache<K, V extends RV, RV = V> {
|
||||
loader(!info, (loadedInfo) => {
|
||||
if (!loadedInfo) return;
|
||||
|
||||
let info = this.map.get(key)!;
|
||||
const info = this.map.get(key)!;
|
||||
if (info instanceof Promise) {
|
||||
const state = $state(loadedInfo);
|
||||
this.map.set(key, state as V);
|
||||
@@ -30,6 +30,54 @@ export class FilesystemCache<K, V extends RV, RV = V> {
|
||||
|
||||
return info ?? promise;
|
||||
}
|
||||
|
||||
async bulkGet(
|
||||
keys: Set<K>,
|
||||
loader: (keys: Map<K, boolean>, resolve: (values: Map<K, RV>) => void) => void,
|
||||
) {
|
||||
const states = new Map<K, V>();
|
||||
const promises = new Map<K, Promise<V>>();
|
||||
const resolvers = new Map<K, (value: V) => void>();
|
||||
|
||||
keys.forEach((key) => {
|
||||
const info = this.map.get(key);
|
||||
if (info instanceof Promise) {
|
||||
promises.set(key, info);
|
||||
} else if (info) {
|
||||
states.set(key, info);
|
||||
} else {
|
||||
const { promise, resolve } = Promise.withResolvers<V>();
|
||||
this.map.set(key, promise);
|
||||
promises.set(key, promise);
|
||||
resolvers.set(key, resolve);
|
||||
}
|
||||
});
|
||||
|
||||
loader(
|
||||
new Map([
|
||||
...states.keys().map((key) => [key, false] as const),
|
||||
...resolvers.keys().map((key) => [key, true] as const),
|
||||
]),
|
||||
(loadedInfos) =>
|
||||
loadedInfos.forEach((loadedInfo, key) => {
|
||||
const info = this.map.get(key)!;
|
||||
const resolve = resolvers.get(key);
|
||||
if (info instanceof Promise) {
|
||||
const state = $state(loadedInfo);
|
||||
this.map.set(key, state as V);
|
||||
resolve?.(state as V);
|
||||
} else {
|
||||
Object.assign(info, loadedInfo);
|
||||
resolve?.(info);
|
||||
}
|
||||
}),
|
||||
);
|
||||
|
||||
const newStates = await Promise.all(
|
||||
promises.entries().map(async ([key, promise]) => [key, await promise] as const),
|
||||
);
|
||||
return new Map([...states, ...newStates]);
|
||||
}
|
||||
}
|
||||
|
||||
export const decryptDirectoryMetadata = async (
|
||||
|
||||
Reference in New Issue
Block a user