我正在嘗試通過 IndexedDB 為長時間的媒體記錄實作 Blob 存盤。
我的代碼在 Chrome 和 Edge 中運行良好(尚未在 Safari 中測驗)——但在 Firefox 中不會執行任何操作。沒有錯誤,它只是不嘗試通過初始資料庫連接(成功)來滿足我的請求。直覺上,似乎處理被某些東西阻塞了。但是我的代碼中沒有任何會阻塞的東西。
代碼的簡化版本(沒有大量的日志記錄和過多的錯誤檢查,我已經添加了嘗試除錯):
const dbName = 'recording'
const storeValue = 'blobs'
let connection = null
const handler = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB
function connect() {
return new Promise((resolve, reject) => {
const request = handler.open(dbName)
request.onupgradeneeded = (event) => {
const db = event.target.result
if (db.objectStoreNames.contains(storeValue)) {
db.deleteObjectStore(storeValue)
}
db.createObjectStore(storeValue, {
keyPath: 'id',
autoIncrement: true,
})
}
request.onerror = () => {
reject()
}
request.onsuccess = () => {
connection = request.result
connection.onerror = () => {
connection = null
}
connection.onclose = () => {
connection = null
}
resolve()
}
})
}
async function saveChunk(chunk) {
if (!connection) await connect()
return new Promise((resolve, reject) => {
const store = connection.transaction(
storeValue,
'readwrite'
).objectStore(storeValue)
const req = store.add(chunk)
req.onsuccess = () => {
console.warn('DONE!') // Fires in Chrome and Edge - not in Firefox
resolve(req.result)
}
req.onerror = () => {
reject()
}
req.transaction.oncomplete = () => {
console.warn('DONE!') // Fires in Chrome and Edge - not in Firefox
}
})
}
// ... on blob available
await saveChunk(blob)
到目前為止我嘗試了什么:
- 關閉任何其他瀏覽器視窗,任何可以算作“打開連接”的東西可能會阻止執行
- 重繪 Firefox 組態檔
- 讓我的同事在他自己的機器上測驗代碼=>同樣的結果
可能有用的其他資訊:在 Nuxt 2.15.8 開發環境中運行 (localhost:3000)。代碼在組件中用作 Mixin。該專案相當大,使用了一堆不同的瀏覽器 API。可能會發生某種碰撞?!不過,這是我們唯一使用 IndexedDB 的地方,因此要深入了解而不拋出任何錯誤似乎幾乎是不可能的。
編輯:
當我創建一個全新的資料庫時,有一個簡短的視窗,事務在其中正常完成,但是經過一段時間/觸發了某些事情后,它又回到了無限期排隊的狀態。
我今天早上發現我有這個結構:
...
clearDatabase() {
// get the store
const req = store.clear()
req.transaction.oncomplete = () => console.log('all good!')
}
await this.connect()
await this.clearDatabase()
“一切都好”被解雇了。但是任何后續請求都像以前一樣被破壞了。在頁面重新加載時,甚至clearDatabase
請求再次被破壞。
持續使用會導致某些問題。
編輯2:
它顯然與不id
使用 autoIncrement 選項保存 Blob 實體有關。它不僅無聲地失敗,而且基本上完全破壞了資料庫。如果我手動為 Blob 物件分配一個遞增的 ID,它就可以作業!如果我為一個普通的簡單物件省略了這個id
欄位,它也可以作業!有人知道嗎?我覺得保存 blob 是一個常見的用例,所以應該已經找到了?!
uj5u.com熱心網友回復:
除非另有證明,否則我得出結論,這是一個 Firefox 錯誤,并在 Bugzilla 上開了一張票。
這種情況發生在 Blob 上,但也可能適用于其他實體。如果您發現自己處于相同的情況,則有一個解決方法。autoIncrement
在嘗試將 ID 保存到資料庫之前,不要手動依賴和分配 ID。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/537777.html
標籤:火狐浏览器索引数据库
上一篇:為什么我的影片會向MozFirefox中的微調器添加人工制品?
下一篇:網站加載在FireFox上未完成