indexedDb.open()を実行しているときにイベントが発生しないことがあります。 タイムアウトを設定してopenRequestの状態を観察すると、準備完了状態は「完了」に設定されます。私がopenRequest.resultのdb上でトランザクションを行うと、正常に動作します。indexedDbイベントは開いていません。
「onsuccess」や他のイベントハンドラを追加する前に、openRequestの実行が完了している場合があります。言い換えれば、次のイベントループでは実行されません。
イベントが発生しない場合、「x」時間後に状態を検査できます。しかし、このアプローチはハックで脆弱です。 誰かがこれに対処するより良い方法を知っていますか? readyState
が"done"
になったときに
var db;
var openRequest = window.indexedDB.open("todos", 1);
openRequest.onerror = function(event) {
console.error('error in open', event);
};
openRequest.onsuccess = (event) => {
console.log('success ' , event)
};
openRequest.onupgradeneeded = (event) => {
console.log('upgradeneeded ' , event);
db = event.target.result;
db.createObjectStore("toDoList", { keyPath: "taskTitle" });
};
openRequest.onblocked = (event) => {
console.log('blocked ' , event);
};
setTimeout(() => {
console.log('timeout');
console.log(openRequest.readyState) // equals done
}, 10000)
なぜグローバルdb変数を使用していますか?そして、なぜあなたはonupgradeneeded関数内からdbに値を割り当てるだけですか? – Josh
このコードはロギングステートメントだけで簡素化されています。 dbは成功ハンドラからも設定されます。 – sbr