¿Es malo abrir varias conexiones de base de datos en indexedDB?

He estado trabajando con IndexedDB por un tiempo y puedo crear una nueva base de datos, crear una tienda y agregar un valor durante la “actualización necesaria”. Lo que no entiendo es, ¿la base de datos permanece “abierta” o tiene que volver a abrirla dentro de cada función que necesita acceso para leer / escribir información en la base de datos?

Por ejemplo, aquí está mi código (que funciona) para crear una nueva base de datos e insertar un registro:

$(document).ready(function() { var db; function initDB() { console.log("opening db..."); var req = indexedDB.open(dbName, version); req.onsuccess = function(event) { db = this.result; console.log("opening db is done"); } req.onerror = function(event) { console.log("error opening db: ", event.target.errorCode); } req.onupgradeneeded = function(event) { db = event.target.result; var store = db.createObjectStore("creds", { autoincrement: true }); store.add({ username:'none', password:'none'}, 1); } } 

Lo que me está causando confusión es que, cuando necesito acceder a los registros en esa base de datos, o agregar más registros, o eliminar registros, pensé que solo podría crear una nueva función e insertar algunos valores. Esto es lo que tengo (que falla):

  function saveCreds() { usr = $("#username").val(); psw = $("#password").val(); $.getJSON(baseURL + "cred-check/?callback=?", { username:usr, password:psw }, function(data) { if (data.creds_good == 'true'); { // NEXT LINE FAILS var store = db.transaction(['creds'], 'readwrite').objectStore('creds'); var request = store.get(1); request.onsuccess = function (event) { var data = request.result; data.username = usr; data.password = psw; var requestUpdate = store.put(data, 1); requestUpdate.onerror = function(event) { console.log("error putting value..."); } } } }); } 

Esta función saveCreds y initDB están dentro de la función $(document).ready() y la variable db se declara fuera de las funciones initDB y saveCreds , pero dentro de la función $(document).ready() así que creo que mi scope estaba bien.

El problema es que la variable db no está definida. Recibo el error: Cannot call method "transaction" of undefined .

Entonces, ¿esto significa que para cada función que necesite acceso a los datos en la base de datos, necesito reabrirla y reasignarla a una variable para poder manipular / leer los datos en la base de datos?

Mi respuesta tiene que ser: a veces. No, no es necesario abrir siempre una nueva conexión. Puede utilizar varias transacciones en una conexión. Una forma sencilla de hacer esto es pasar la variable db a esas funciones. Sin embargo, debe ser consciente de la naturaleza asíncrona de javascript y de indexedDB. Hay ocasiones en las que necesitarás abrir una nueva conexión. Por ejemplo, en el gatillo de algún otro evento.

Por lo tanto, si está realizando varias transacciones, use una función grande como la siguiente:

 function domultiplethings() { var db = ... callfunction1(db); callfunction2(db); } function callfunction1(db) { if(!db) { // open a new connection then call ourself } else { // active connection, do read/write stuff } } 
    Intereting Posts