В нескольких документах IndexedDB приведена следующая последовательность действий для инициализации БД и создания одного ObjectStore.
1) request = window.indexedDB.open(...)
2) request.onsuccess = ...;
3) request.onupgradeneeded = ...
Однако я обнаружил, что если шаг (3) будет выполнен через некоторое время, он не будет выполнен.
Вот тестовый код:
var db;
var request = window.indexedDB.open("birds-db", 1);
const startTime = new Date().getTime();
const simulatedDelay = 300;
function deltaTime() {
return new Date().getTime() - startTime;
}
request.onerror = function(event) {
console.log('error: ' + event);
};
request.onsuccess = function(event) {
console.log('onsuccess was called T' + deltaTime());
db = event.target.result;
};
setTimeout(function() {
console.log('after waiting ' + simulatedDelay + " miliseconds T" + deltaTime());
request.onupgradeneeded = function(event) {
console.log('onupgradeneeded was called T' + deltaTime());
var db = event.target.result;
var objectStore = db.createObjectStore("birds", {
keyPath: "sci_name"
});
};
}, simulatedDelay);
console.log("end " + deltaTime());
В приведенном выше примере, если для simulatedDelay установлено значение 300 миллисекунд, в большинстве случаев все идет хорошо, показывая что-то вроде:
end 1
after waiting 300 miliseconds T302
onupgradeneeded was called T474
onsuccess was called T479
Но установка его на 2000 или более приведет к:
end 0
onsuccess was called T602
after waiting 2000 miliseconds T2001
И "onupgradeneeded" вообще не вызывается.Мой браузер Firefox 60.
Конечно, если я установил «onupgradeneeded» сразу после «open», проблема не возникнет.
Как я могу быть уверен в более сложных ситуациях, что onupgradeeeded всегда устанавливается до того, как произойдет событие?