feat(P25-2/P25-3/P26-2/P28-1/P24-2/P29-3): 落地内部OA够用版前端入口与运营页面
关联 Issue: P25-2, P25-3, P25-4, P26-2, P26-4, P28-1, P28-2, P28-3, P28-4, P24-2, P29-3
这个提交包含在:
@@ -42,13 +42,47 @@ export function createIndexedDbStore(options: IndexedDbStoreOptions) {
|
||||
const tx = db.transaction(storeName, mode);
|
||||
const store = tx.objectStore(storeName);
|
||||
|
||||
let executorSettled = false;
|
||||
let transactionCompleted = false;
|
||||
let settled = false;
|
||||
let executorResult!: T;
|
||||
|
||||
const resolveIfReady = () => {
|
||||
if (!settled && executorSettled && transactionCompleted) {
|
||||
settled = true;
|
||||
resolve(executorResult);
|
||||
}
|
||||
};
|
||||
|
||||
const rejectOnce = (error: unknown) => {
|
||||
if (settled) {
|
||||
return;
|
||||
}
|
||||
settled = true;
|
||||
reject(error instanceof Error ? error : new Error(String(error)));
|
||||
};
|
||||
|
||||
tx.oncomplete = () => {
|
||||
transactionCompleted = true;
|
||||
resolveIfReady();
|
||||
};
|
||||
tx.onerror = () => rejectOnce(tx.error ?? new Error("indexeddb_tx_failed"));
|
||||
tx.onabort = () => rejectOnce(tx.error ?? new Error("indexeddb_tx_aborted"));
|
||||
|
||||
Promise.resolve(executor(store))
|
||||
.then((result) => {
|
||||
tx.oncomplete = () => resolve(result);
|
||||
tx.onerror = () => reject(tx.error ?? new Error("indexeddb_tx_failed"));
|
||||
tx.onabort = () => reject(tx.error ?? new Error("indexeddb_tx_aborted"));
|
||||
executorResult = result;
|
||||
executorSettled = true;
|
||||
resolveIfReady();
|
||||
})
|
||||
.catch((error) => reject(error));
|
||||
.catch((error) => {
|
||||
try {
|
||||
tx.abort();
|
||||
} catch {
|
||||
// noop
|
||||
}
|
||||
rejectOnce(error);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
在新工单中引用
屏蔽一个用户