fix(data): 串行化 AppData 同 key 保存
This commit is contained in:
@@ -36,6 +36,7 @@ const serverDataCache = new Map<ServerDataKey, {
|
||||
loadedAt: number;
|
||||
}>();
|
||||
const serverDataLoadPromises = new Map<ServerDataKey, Promise<unknown | null>>();
|
||||
const serverDataSaveQueues = new Map<ServerDataKey, Promise<void>>();
|
||||
export const SERVER_DATA_CACHE_MS = 30_000;
|
||||
export const SERVER_DATA_SAVE_ERROR_EVENT = 'ftb:server-data-save-error';
|
||||
|
||||
@@ -110,7 +111,20 @@ export async function loadServerData<T>(
|
||||
return promise;
|
||||
}
|
||||
|
||||
export async function saveServerData<T>(key: ServerDataKey, value: T): Promise<void> {
|
||||
export function saveServerData<T>(key: ServerDataKey, value: T): Promise<void> {
|
||||
const previousSave = serverDataSaveQueues.get(key) ?? Promise.resolve();
|
||||
const save = previousSave.then(() => putServerData(key, value));
|
||||
const queueTail = save.catch(() => undefined);
|
||||
serverDataSaveQueues.set(key, queueTail);
|
||||
void queueTail.then(() => {
|
||||
if (serverDataSaveQueues.get(key) === queueTail) {
|
||||
serverDataSaveQueues.delete(key);
|
||||
}
|
||||
});
|
||||
return save;
|
||||
}
|
||||
|
||||
async function putServerData<T>(key: ServerDataKey, value: T): Promise<void> {
|
||||
const payload: { value: T; version?: string | null } = { value };
|
||||
if (serverDataVersions.has(key)) {
|
||||
payload.version = serverDataVersions.get(key) ?? null;
|
||||
|
||||
Reference in New Issue
Block a user