fix: 处理非原子性的先清除后写入操作会setKeys带来永久性数据丢失的风险
parent
f2a17cbe78
commit
c78d89f549
|
|
@ -94,11 +94,17 @@ function createIndexedDBAdapter(
|
||||||
},
|
},
|
||||||
async setKeys(keys) {
|
async setKeys(keys) {
|
||||||
try {
|
try {
|
||||||
// 先清除旧数据,再逐条写入
|
const newKeySet = new Set(keys.map(String));
|
||||||
await manager.clear();
|
// 先写入新数据,确保数据安全落盘
|
||||||
await Promise.all(
|
await Promise.all(
|
||||||
keys.map((key) => manager.setItem(String(key), key, opts.ttl)),
|
keys.map((key) => manager.setItem(String(key), key, opts.ttl)),
|
||||||
);
|
);
|
||||||
|
// 再清理不在新集合中的旧 key
|
||||||
|
const existingKeys = await manager.keys();
|
||||||
|
const toRemove = existingKeys.filter((k) => !newKeySet.has(k));
|
||||||
|
if (toRemove.length > 0) {
|
||||||
|
await Promise.all(toRemove.map((k) => manager.removeItem(k)));
|
||||||
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('[viewedRow] indexedDB persist failed:', error);
|
console.error('[viewedRow] indexedDB persist failed:', error);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue