2011-03-07 24 views
6

在閱讀HTML5 IndexedDB Specification時,我對它的異步請求模型有些懷疑。在查看request api example時,使用open方法啓動異步請求。對HTML5 IndexedDB Async API的疑問

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

在該請求開始時,尚未定義事件處理程序。

  • 這不是一個競賽條件嗎?
  • 在JavaScript解釋器執行onsuccess分配之前open方法成功時會發生什麼?
  • 或者只有在兩個回調都被註冊後才真正開始請求?

在我看來像下面的API會更合乎邏輯:

db.open('AddressBook', 'Address Book', { 
    onsuccess: function(e) { ... }, 
    onerror : function(e) { ... } 
}); 

回答

5

,將沒有競爭條件,因爲JavaScript引擎將完成執行實際範圍(功能),然後觸發任何回調或事件處理器。閱讀關於Mozilla黑客的comment

+3

好的發現,搜索的關鍵詞似乎是「運行完成」。這就解釋了爲什麼代碼可以在沒有任何種族的情況下工作,但我仍然認爲它是糟糕的api設計的標誌。 – 2011-04-13 19:18:50