digamos que tengo el siguiente código que crea la base de datos FUERA de mi llamada Ajax:
// This works on all devices/browsers, and uses IndexedDBShim as a final fallback var indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB || window.shimIndexedDB; // Open (or create) the database var open = indexedDB.open("MyDatabase", 1); // Create the schema open.onupgradeneeded = function() { var db = open.result; var store = db.createObjectStore("MyObjectStore", {keyPath: "id"}); var index = store.createIndex("NameIndex", ["name.last", "name.first"]); };y luego quiero almacenar algunos datos en esta base de datos dentro de mi llamada Ajax así:
$.ajax({ url: "https://sometise.com, headers: { "Authorization": "TOKEN" }, type: "GET", success: function (data) { $(data).each(function (index, el) { var myArray = { ID: el.id, Content: data } ///ADDING THE ABOVE ARRAY TO THE DATABASE LIKE SO HERE open.onsuccess = function() { // Start a new transaction var db = open.result; var tx = db.transaction("MyObjectStore", "readwrite"); var store = tx.objectStore("MyObjectStore"); var index = store.index("NameIndex"); // Add some data store.put({id: el.id, name: {first: myArray, last: "Doe"}}); // Close the db when the transaction is done tx.oncomplete = function() { db.close(); }; } }); } });¡pero el código anterior no hace nada!
Cualquier indicador sería apreciada.
El evento open.onsuccess se activa solo una vez. Esto debería suceder tan pronto como la base de datos esté lista, lo que probablemente suceda antes de que la llamada ajax reciba una respuesta del servidor. Entonces, el evento se activa antes de que adjunte el oyente, lo que significa que nunca se maneja.
onsuccess almacenar el resultado de éxito fuera de la devolución de llamada ajax. O puede usar una versión prometida de IDB como https://github.com/jakearchibald/idb y await dentro de la devolución de llamada de ajax.
Editar: un ejemplo que usa promesas, espera y la biblioteca idb que mencioné anteriormente:
const db = openDB(…); async function doPost() { const response = fetch('https://somesite.com') const tx = (await db).transaction("MyObjectStore", "readwrite"); const store = tx.objectStore("MyObjectStore"); const index = store.index("NameIndex"); // Add some data await store.put(await response); await tx.done; }Debería funcionar así, pero recomendaría leer sobre promesas en general. También considere el uso de funciones de lenguaje moderno como const/let y fetch, que generalmente hacen que la vida sea mucho más fácil.