0

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

なぜグローバルdb変数を使用していますか?そして、なぜあなたはonupgradeneeded関数内からdbに値を割り当てるだけですか? – Josh

+0

このコードはロギングステートメントだけで簡素化されています。 dbは成功ハンドラからも設定されます。 – sbr

答えて

1

"success"いずれかまたは"error"イベントが発生しなければなりません。それが起こっていなければ、あなたはブラウザのバグを見つけました。

コメントに記載されているとおり、onsuccessハンドラにはdb = event.target.resultが必要です。そうでない場合は、アップグレードが不要な場合はdbが設定されません。これがあなたのエラーの原因ではないと確信していますか?私たちは「ONSUCCESS」や他のイベントハンドラ

を添付してもらう前に、いくつかのケースでopenRequestの実行が完了する

(すなわち多分success焼成、あなただけの結果をキャプチャしていなかった?でした)

これが起こった場合、ブラウザのバグになります。ブラウザー間で一貫した動作が見られますか?これを確実に再現できますか?

+0

この現象は、chrome、edge、safari、firefoxのフィールドで確認できます。残念ながら、復興のステップはありません。 – sbr

+0

あなたが見ている動作は期待されていません。コードにバグがある可能性があります。あなたの実際のコードを見ることなく、それ以上の提案をするのは難しいでしょう。 –

関連する問題