怀疑HTML5 IndexedDB异步API

Jör*_*ann 7 javascript html5 asynchronous

在阅读HTML5 IndexedDB规范时,我对其异步请求模型有一些疑问.查看请求api示例时,该open方法用于启动异步请求.

var request = indexedDB.open('AddressBook', 'Address Book');
request.onsuccess = function(evt) {...};
request.onerror = function(evt) {...};
Run Code Online (Sandbox Code Playgroud)

在此请求启动时,尚未定义事件处理程序.

  • 这不是竞争条件吗?
  • open在javascript解释器执行赋值之前方法成功时会发生什么onsuccess
  • 或者一旦两个回调都被注册,请求才真正开始?

在我看来,像下面这样的api会更合乎逻辑:

db.open('AddressBook', 'Address Book', {
    onsuccess: function(e) { ... },
    onerror  : function(e) { ... }
});
Run Code Online (Sandbox Code Playgroud)

小智 6

没有竞争条件,因为JavaScript引擎将完成执行实际范围(函数),然后触发任何回调或事件处理程序.阅读以下关于Mozilla Hacks的评论.

  • 很好的发现,搜索的关键字似乎是"运行完成".这解释了为什么代码在没有任何比赛的情况下工作,但我仍然认为这是一个糟糕的api设计的标志. (3认同)