我想在Chrome扩展程序中使用持久存储或持久存储 - 所以我目前要做的是创建一个Indexeddb数据库,并从另一个页面查询。
以下是我的一个内容脚本:
Company(1234, NYTimes, List(Employee(0987, John, 30000),Employee(4567, Bob, 50000)))
这称之为:
chrome.extension.sendRequest({
"type": "search",
"text": char
},
其中:
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;
}
然而,它提供了一个空的indexedDB,尽管它在后台脚本中:
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();
};
},
等...
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"]});
为什么indexedDB为空?难道我做错了什么?我第一次在添加它之后重新加载插件,它正常工作,给我我想要的值,但从那以后它没有工作,它返回了空值。
这是我得到的错误:
tx.oncomplete = function() {
db.close();
};
这是否意味着我需要承诺或其他什么?
答案 0 :(得分:0)
您无法根据代码建议从return getData.result;
返回值。您需要更熟悉异步js才能使用indexedDB。
举一个简短的例子,假装你有一个按钮,并在这个按钮上有一个事件监听器。你能从事件监听器函数返回一个值吗?不可以。同样,你不能在这里返回值。
简而言之,您可以将结果传递给回调函数。或使用承诺。
function db_query(..., callbackFunction) {
getData.onsuccess = function(){
// Instead of returning, call the callback function
callbackFunction(getData.result);
};
}
然后,不是获取db_query的结果,而是继续在callbackFunction体内执行。
db_query(..., function myCallback(value) {
console.log(value);
});