2017-10-09 152 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代码块完成之前它不会。

当你单独输入行时,你将它分成多个块,你是对的:事件回来了,你输入第二行代码的速度有多快。 (你可能输得不够快,无法赢得比赛!)