2017-09-27 4 views
0

Ich versuche, eine API zu schreiben, um meine indexedDB-Funktionalität zu behandeln. Ich habe Probleme, das DB-Objekt in einer Klasse zu speichern, weil ich auf die .onsuccess Ereignisse von der Anforderung .open() warten muss, um zu schießen.ruft window.indexedDB.open() mit jeder Transaktion verschwenderisch

Also schrieb ich eine Methode, die db initialisieren:

async initializeDB() { 
    return new Promise((resolve, reject) => { 
     const { 
     dbVersion, 
     databaseName, 
     fieldsObjectStoreName, 
     filedObjectStoreKeyName 
     } = IndexDbParams; 
     // Open a connection to indexDB 
     const DbOpenRequest = window.indexedDB.open(databaseName, dbVersion); 
     DbOpenRequest.onsuccess = e => { 
     const db = DbOpenRequest.result; 
     // Create data stores if none exist 
     if (db.objectStoreNames.length < 1) { 
      if (db.objectStoreNames.indexOf(fieldsObjectStoreName) < 0) { 
      db.createObjectStore(fieldsObjectStoreName, { 
       keyPath: filedObjectStoreKeyName 
      }); 
      } 
     } 
     // return db object, will come hore from onupgradeneeded as well 
     resolve(db); 
     }; 
     // If we need to upgrade db version 
     DbOpenRequest.onupgradeneeded = e => { 
     const db = event.target.result; 
     const objectStore = db.createObjectStore(fieldsObjectStoreName, { 
      keyPath: filedObjectStoreKeyName 
     }); 
     }; 
    }); 
    } 

Welche dann würde ich am Anfang alle meine anderen Methoden aufrufen, zum Beispiel:

async getData() { 
    this.initializeDB().then(db => { 
    // do stuff with the db object 
    }) 
} 

Meine Frage ist - ist Dies verschwenden viel mehr Ressourcen als .open() einmal aufrufen und dann im globalen Zustand speichern? Was (wenn überhaupt) könnten die möglichen Konsequenzen dieses Ansatzes sein?

Antwort

0

Definitiv nicht verschwenderisch.

All meine Projekte in etwa so aussehen:

function openDb() { 
    return new Promise(function(resolve, reject) { 
    var request = indexedDB.open(); 
    request.onsuccess =() => resolve(request.result); 
    }); 
} 

function doSomeDbAction() { 
    openDb().then(function(db) { 
    // do stuff with db 
    }).catch(console.warn).finally(function(db) { 
    if(db) db.close(); 
    }); 
} 

function doAnotherDbAction() { 
    openDb().then(function(db) { 
    // do more stuff with db 
    }).catch(console.warn).finally(function(db) { 
    if(db) db.close(); 
    }); 
} 
+0

Haben Sie einen Vergleich zwischen einem db objet im Speicher gegenüber der Latenz Speicher einen neuen .open() Antrag Ursachen öffnen? –

+0

Nichts bereit zu zeigen. Aber ich nehme an, es wäre nicht schwer, selbst etwas zu erschaffen. – Josh

Verwandte Themen