0

我看到有時在執行indexedDb.open()時,沒有事件被觸發。 如果我設置超時並觀察openRequest的狀態,就緒狀態設置='完成'。如果我在openRequest.result的db上做任何事務,它就可以正常工作。indexedDb沒有事件在開啓時觸發

我的猜測是,在某些情況下,openRequest執行完成後纔會附加'onsuccess'或其他事件處理程序,換句話說,它不會在下一個事件循環中執行。

所以,如果沒有事件發生,我可以在'x'時間後檢查狀態。然而,這種方法是駭人而脆弱的。 有誰知道更好的方法來解決這個問題?

var db; 
var openRequest = window.indexedDB.open("todos", 1); 
openRequest.onerror = function(event) { 
    console.error('error in open', event); 
}; 
openRequest.onsuccess = (event) => { 
    console.log('success ' , event) 
}; 
openRequest.onupgradeneeded = (event) => { 
    console.log('upgradeneeded ' , event); 
    db = event.target.result; 
    db.createObjectStore("toDoList", { keyPath: "taskTitle" }); 
}; 
openRequest.onblocked = (event) => { 
    console.log('blocked ' , event); 
}; 

setTimeout(() => { 
     console.log('timeout'); 
     console.log(openRequest.readyState) // equals done 
}, 10000) 
+0

爲什麼使用全局數據庫變量?而且,爲什麼你只需要在onupgradeneeded函數中爲db賦值呢? – Josh

+0

這段代碼只是簡單的記錄語句。數據庫也將從成功處理程序中設置。 – sbr

回答

1

無論是"success"或當readyState成爲"done""error"事件必須開火。如果這沒有發生,那麼你已經發現了一個瀏覽器錯誤。

正如註釋中所述,您還需要db = event.target.result位於onsuccess處理程序中,否則在不需要升級時不會設置db。你確定這不是你錯誤的根源嗎? (即可能success射擊,你只是沒有捕捉結果?)

在某些情況下,openRequest執行完畢之前,我們得到重視「的onSuccess」或其他事件處理程序

如果發生了這將是一個瀏覽器錯誤。你是否看到跨瀏覽器的一致行爲?你能可靠地重現嗎?

+0

我看到這種行爲,在鉻,邊緣,Safari瀏覽器和Firefox。不幸的是沒有重複步驟。 – sbr

+0

您看到的行爲不是預期的。您的代碼中可能存在一個錯誤;沒有看到你的實際代碼,就很難提出進一步的建議。 –