2017-10-09 15 views
0

私はindexedDBの操作方法についてtutorialを見てきました。次のコードを示唆しています。indexedDBの作成とオブジェクトストアの作成

dbreq = window.indexedDB.open('testaaaaa'); 
dbreq.onupgradeneeded = function(event){ 
    var db = event.target.result; 
    var objectStore = db.createObjectStore("cats"); 
    console.log("hi"); 
} 

VM321:5 hi 

私はそれらを個別に入力してみてください場合、私はその後、JavaScriptコンソールtogether.Butに貼り付ける場合、それは動作します。そして、

dbreq = window.indexedDB.open('testbbbbb'); 

dbreq.onupgradeneeded = function(event){ 
    var db = event.target.result; 
    var objectStore = db.createObjectStore("cats"); 
    console.log("hi"); 
} 

は、出力はありません。

このようにデータベースをセットアップすることで技術的に競合状態が作成されますが、これは決して当てはまることはありません。これをしないオブジェクトストアを作成するより良い方法はありますか?

+0

競合状態はありません。 EventListenerとXMLHttpRequestの仕組みを見てみることをお勧めします。 – Josh

答えて

1

JavaScriptには「実行完了」のセマンティクスがあります。つまり、同じコンテキストで他のコードを実行するコードブロックを実行する途中で実行が中断されることはありません。 JSの全体ブロックの終わりに到達するまで

// make the request 
var request = indexedDB.open(...); 

// hook up the event listener 
request.onupgradeneeded = function(e) { ... }; 

// hook up another event listener 
request.onsuccess = function(e) { ... }; 

イベントがを発射しないので、何のレースはありません。だから、1つのブロックに起こっているので、これは、罰金です。バックグラウンドの背後には、ディスパッチするのを待っている間にキューに入れられた「アップグレードされた」イベントがあるかもしれませんが、そのJSコードのブロック全体が完了するまでそれは完了しません。

行を別々に入力すると、それを複数のブロックに分割しているので、正しいと思います。イベントの復帰と2番目のコード行の入力の競合があります。 (おそらくレースに勝つためには速く入力しないでください)

関連する問題