فهرست منبع

fix: 解决indexedDB的setItem、,removeItem以及clear在请求成功时而不是事务完成时触发resolve问题

layhuts 1 ماه پیش
والد
کامیت
df5cb426d1
1فایلهای تغییر یافته به همراه18 افزوده شده و 9 حذف شده
  1. 18 9
      packages/@core/base/shared/src/cache/indexeddb-driver.ts

+ 18 - 9
packages/@core/base/shared/src/cache/indexeddb-driver.ts

@@ -34,10 +34,13 @@ class IndexedDBDriver implements IStorageDriver {
     return new Promise((resolve, reject) => {
       const tx = db.transaction(this.storeName, 'readwrite');
       const store = tx.objectStore(this.storeName);
-      const request = store.clear();
+      store.clear();
 
-      request.addEventListener('success', () => resolve());
-      request.addEventListener('error', () => reject(request.error));
+      tx.addEventListener('complete', () => resolve());
+      tx.addEventListener('error', () => reject(tx.error));
+      tx.addEventListener('abort', () =>
+        reject(tx.error ?? new Error('Transaction aborted')),
+      );
     });
   }
 
@@ -74,10 +77,13 @@ class IndexedDBDriver implements IStorageDriver {
     return new Promise((resolve, reject) => {
       const tx = db.transaction(this.storeName, 'readwrite');
       const store = tx.objectStore(this.storeName);
-      const request = store.delete(key);
+      store.delete(key);
 
-      request.addEventListener('success', () => resolve());
-      request.addEventListener('error', () => reject(request.error));
+      tx.addEventListener('complete', () => resolve());
+      tx.addEventListener('error', () => reject(tx.error));
+      tx.addEventListener('abort', () =>
+        reject(tx.error ?? new Error('Transaction aborted')),
+      );
     });
   }
 
@@ -86,10 +92,13 @@ class IndexedDBDriver implements IStorageDriver {
     return new Promise((resolve, reject) => {
       const tx = db.transaction(this.storeName, 'readwrite');
       const store = tx.objectStore(this.storeName);
-      const request = store.put(value, key);
+      store.put(value, key);
 
-      request.addEventListener('success', () => resolve());
-      request.addEventListener('error', () => reject(request.error));
+      tx.addEventListener('complete', () => resolve());
+      tx.addEventListener('error', () => reject(tx.error));
+      tx.addEventListener('abort', () =>
+        reject(tx.error ?? new Error('Transaction aborted')),
+      );
     });
   }