2017-10-09 151 views
0

我一直在尋找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有所謂的「運行到完成」語義。這意味着在執行一段代碼以在同一上下文中運行其他代碼的過程中,執行不會中斷。因此,這是很好的,因爲它是在一個塊中發生的事情:

// 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) { ... }; 

事件達到JS的整個塊的結束,直到將不會觸發,所以沒有比賽。在幕後,可能會有一個「需要升級」的事件排隊等待分派,但在整個JS代碼塊完成之前它不會。

當你單獨輸入行時,你將它分成多個塊,你是對的:事件回來了,你輸入第二行代碼的速度有多快。 (你可能輸得不夠快,無法贏得比賽!)