2017-12-16 11 views
0

Chrome拡張機能で永続的または永続的なストレージを使用したいのですが、現在私がしようとしているのは、Indexeddbデータベースを作成し、それを別のページからクエリすることです。Chrome拡張機能の永続ストレージ

はここに私のコンテンツスクリプトのいずれかから何か:呼び出す

 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"]}); 

等...

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

なぜのIndexedDBは空ですか?私は何か間違っているのですか?私はこれを追加した後初めてプラグインをリロードしたとき、正しく動作し、私が望む値を与えましたが、それ以来、それは機能しておらず、空の値を返しました。ここで

は私が取得エラーです:

_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. 

は、これはちょうど私が約束か何かを必要とするということですか?

+0

あなたは 'chrome.storage' APIをチェックしましたか? https://developer.chrome.com/extensions/storage – Siggy

+0

私のように巨大なデータベースでは動作しません –

+0

'db_query'関数の' var db = open.result; '割り当てが問題であるようですが、データベースが開くまで待つ必要があります。別のもの...あなたの 'return getData.result'は' db_query'の呼び出し元に戻らず、イベントエミッターに戻ります。 – Siggy

答えて

0

コードが示すとおり、return getData.result;から値を返すことはできません。 indexedDBを使用するには、async jsにもっと慣れておく必要があります。

簡単な例を挙げれば、このボタンにはボタンとイベントリスナーがあるようです。イベントリスナー関数から値を返せますか?いいえ、同様に、ここで値を返すことはできません。

簡単に言えば、結果をコールバック関数に渡すことができます。または約束をしてください。

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); 
}); 
+0

Chrome拡張機能の別の部分(バックグラウンドページとメインページで実行されるコンテンツスクリプトとの違い)ではないとは思いますが、最終的にはそれを問題にすると約束事に移行しようとしていましたが、 。私が知る必要がある問題は、indexdbが空である理由です。 –

+0

データベースがいっぱいになると、必要な場所にデータが返されます –

関連する問題