我一直在关注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控制台中,它就可以工作。但是如果我尝试单独输入它们的话:
dbreq = window.indexedDB.open('testbbbbb');
然后:
dbreq.onupgradeneeded = function(event){
var db = event.target.result;
var objectStore = db.createObjectStore("cats");
console.log("hi");
}
没有输出。
因此,这种设置数据库的方式在技术上会产生竞争条件,尽管这种情况不太可能发生。有没有更好的方法来创建一个没有做到这一点的对象存储?
答案 0 :(得分:1)
JavaScript具有所谓的“运行到完成”语义。这意味着在执行代码块的过程中不会中断执行,以在同一个上下文中运行其他代码。所以这很好,因为它发生在一个区块中:
pattern2
事件不会触发直到达到整个JS块的末尾,因此没有竞争。在幕后可能有一个“upgradeneeded”事件排队等待调度,但是直到整个JS代码块完成它才会发生。
当您单独键入行时,您将其拆分为多个块并且您是对的:事件返回与您键入第二行代码的速度之间存在竞争。 (你可能没有足够快的速度赢得比赛!)