2017-02-16 42 views
0

我看到即使objectStoreNames列表爲空,也會調用成功回調中的indexedDb打開請求。indexedDb打開onsucess而沒有onupgradeneeded事件

我相信預期的行爲是如果objectStorenames.length爲零,則會調用「onupgradeneeded」處理函數。

有沒有人知道爲什麼會發生這種情況?

jsbin link

var db; 
var DBOpenRequest = window.indexedDB.open("todos", 1); 


DBOpenRequest.onerror = function(event) { 
    console.error('error in open', event); 
}; 

DBOpenRequest.onsuccess = function(event) { 
    db = event.target.result; 
    var objectStores = db.objectStoreNames.length; 
    console.log('success event, number of objectStores: ' + objectStores); 
}; 

DBOpenRequest.onupgradeneeded = function(event) { 
    db = event.target.result; 
    var objectStores = db.objectStoreNames.length; 

    console.log('upgradeneeded event, number of objectStores: ' + objectStores); 

    db.createObjectStore("toDoList", { keyPath: "taskTitle" }); 
}; 
+0

即使商店的名稱列表爲空,查詢仍然有效,因此成功,而不是錯誤。您必須查看onsuccess回調中的查詢結果。 – John

+0

我懷疑你以某種方式已經在版本爲「1」的Edge中有一個空的數據庫。將版本更改爲「2」並且upgradeneeded可能會觸發。或從Edge清除您的IDB。 – dgrogan

+0

我想了解是否有一個已知的路徑可能會導致indexedDb處於此狀態。如果我從瀏覽器中刪除indexedDb數據庫,問題就解決了。 – sbr

回答

0

問題是還有一段代碼正在調用indexedDB.open,但未收聽upgradeneeded事件。

1

這似乎是IndexedDB的預期行爲。在創建對象庫之前,您正在查找onupgradeneededdb.objectStoreNames.length。您需要在onsuccess回撥中檢查它。

我還注意到,在Chrome,Firefox,Edge和IE中,jsbin中的行爲是相同的。