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 bietetdb_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?
Haben Sie die 'chrome.storage' API überprüft? https://developer.chrome.com/extensions/storage – Siggy
Funktioniert nicht für eine riesige Datenbank wie ich habe –
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