2017-12-16 3 views
0

Ich möchte in einer Chrome-Erweiterung persistent oder persistent-ish-Speicher haben. Daher versuche ich derzeit, eine Indexeddb-Datenbank zu erstellen und diese von einer anderen Seite abzurufen.Dauerhafter Speicher in der Chrome-Erweiterung

Hier ist etwas von einem meiner Content-Skripte:

 chrome.extension.sendRequest({ 
      "type": "search", 
      "text": char 
     }, 

Welche dies nennt:

search: function(text) { 
    var entry = this.db_query(text); 
    if (entry != null) { 
     for (var i = 0; i < entry.data.length; i++) { 
      var word = entry.data[i][1]; 
     } 
    } 
    return entry; 
} 

Welche hier geht:

eine leere IndexedDB bietet
db_query: function(text) { 
    var background = chrome.extension.getBackgroundPage(); 
    console.log(background); 
    var open = indexedDB.open("CEDICT", 1); 
    var db = open.result; 
    var tx = db.transaction("CEDICT", "readwrite"); 
    var store = tx.objectStore("CEDICT"); 
    var index2 = store.index("simplified"); 

    var getData = index2.get(text); 

    getData.onsuccess = function() { 
     console.log(getData.result); 
     return getData.result; 
}; 


    tx.oncomplete = function() { 
    db.close(); 
}; 
}, 

die jedoch, obwohl dies in einem Hintergrundskript ist:

var indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB || window.shimIndexedDB; 

var open = indexedDB.open("CEDICT", 1); 

open.onupgradeneeded = function() { 
    var db = open.result; 
    var store = db.createObjectStore("CEDICT", {autoIncrement:true}); 
    var index1 = store.createIndex("traditional", 'traditional'); 
    var index2 = store.createIndex("simplified", 'simplified'); 
}; 

open.onsuccess = function() { 
    var db = open.result; 
    var tx = db.transaction("CEDICT", "readwrite"); 
    var store = tx.objectStore("CEDICT"); 

store.put({"traditional": "三體綜合症", "simplified": "三体综合症", "tones": ["1", "3", "1", "2", "4"]}); 
store.put({"traditional": "□", "simplified": "□", "tones": ["1"]}); 
store.put({"traditional": "○", "simplified": "○", "tones": ["2"]}); 

etc ...

tx.oncomplete = function() { 
    db.close(); 
}; 

Warum ist IndexedDB leer? Mache ich etwas falsch? Das erste Mal, nachdem ich das Plugin neu geladen hatte, funktionierte es richtig und gab mir die Werte, die ich wollte, aber seitdem hat es nicht funktioniert und es hat leere Werte zurückgegeben.

Hier ist ein Fehler, den ich bekommen:

_generated_background_page.html:1 Error in event handler for extension.onRequest: InvalidStateError: Failed to read the 'result' property from 'IDBRequest': The request has not finished. 

bedeutet dies nur brauche ich ein Versprechen oder so etwas?

+0

Haben Sie die 'chrome.storage' API überprüft? https://developer.chrome.com/extensions/storage – Siggy

+0

Funktioniert nicht für eine riesige Datenbank wie ich habe –

+0

Ihre 'var db = open.result;' Zuweisung in der 'db_query' Funktion scheint das Problem, Sie sollte warten, bis die Datenbank geöffnet ist. Eine andere Sache ... Ihr 'return getData.result' kehrt nicht zum Aufrufer der' db_query' zurück, es wird zum Ereignisemitter zurückkehren. – Siggy

Antwort

0

Sie können den Wert nicht wie im Code vorgeschlagen von return getData.result; zurückgeben. Sie müssen mit async js vertrauter werden, um indexedDB zu verwenden.

Um nur ein kurzes Beispiel zu geben, tu so, als hättest du eine Schaltfläche und einen Ereignis-Listener auf dieser Schaltfläche. Könnten Sie einen Wert von der Event-Listener-Funktion zurückgeben? Nein. In ähnlicher Weise können Sie den Wert hier nicht ausgeben.

Kurz, Sie können das Ergebnis stattdessen an eine Callback-Funktion übergeben. Oder verwende ein Versprechen.

function db_query(..., callbackFunction) { 
    getData.onsuccess = function(){ 
    // Instead of returning, call the callback function 
    callbackFunction(getData.result); 
    }; 
} 

Anstatt das Ergebnis von db_query zu erhalten, setzen Sie stattdessen die Ausführung im callbackFunction-Textkörper fort.

db_query(..., function myCallback(value) { 
    console.log(value); 
}); 
+0

Ich würde das schließlich in ein Versprechen verwandeln, wenn es ein Problem wäre, obwohl ich nicht denke, dass es ein ganz anderer Teil der Chrome-Erweiterung ist (Hintergrundseite vs. Inhaltsskripte, die auf der Hauptseite laufen) . Das Problem, das ich wissen muss, ist, warum indexdb leer ist –

+0

Ich weiß, dass wenn die Datenbank voll ist, gibt es die Daten, wo ich es will –

Verwandte Themen