Принудительное обновление в IndexedDB


Я пытаюсь принудительно обновить базу данных в IndexedDB, отправив открытый запрос с номером версии текущей базы данных, увеличенным на единицу:

var openRequest = indexedDB.open("db-name", dbVariable.version + 1);
Однако событие onupgradeneeded никогда не запускается, и openRequest остается в состоянии pending бесконечно.

Что я делаю не так?

Есть ли другой способ принудительно обновить базу данных в IndexedDB?

EDIT

Скажем, у меня есть функция connect2db, которая принимает переменную version:

function connect2db(version) {
    var openRequest = indexedDB.open("database-name", version);

    openRequest.onsuccess = function(e) {
        databaseVariable = e.target.result;
    }

    openRequest.onupgradeneeded = function(e) {
        databaseVariable = e.target.result;
        // Do schema update...
    }
}

И у меня есть еще одно обстоятельство, в котором я хотел бы обновить схему базы данных:

connect2db(databaseVariable.version + 1);

Предположим, что darabaseVariable уже существует и указывает на базу данных

Когда я пробовал запустить код в этом формате, событие onupgradeneeded никогда не срабатывает. Что может быть происходит не так?

1 2

1 ответ:

Проблема, вероятно, заключается в вашей установке "databaseVariable". Вы не можете сделать это так, как вы, кажется, ожидаете. Возможно, вы захотите просмотреть или узнать больше о написании асинхронного кода. Полный ответ очень длинен, и уже несколько раз был написан для этого типа вопроса. Рассмотрим некоторые ответы на другие вопросы с помощью тега indexedDB.

Очень кратко, убедитесь, что вы понимаете, как работает следующее:
var x = 1;
console.log(x);
setTimeout(function() {
  x = 2;
  console.log(x);
}, 0);
x = 3;
console.log(x);

Ваш код написан так, что вы ожидаете увидеть 123, но это выводит 132. Убедитесь, что вы понимаете, почему.