Как закрыть и заново открыть базу данных indexedDB без перезагрузки страницы? - PullRequest
1 голос
/ 04 марта 2020

Пытаясь отловить ошибки, связанные с запросами к базе данных indexedDB, и предлагая варианты для восстановления базы данных, я хотел бы предложить вариант закрытия базы данных, ее повторного открытия и сброса значений данных отображения, хранящихся в ОЗУ. Поскольку на страницу действует расширение, я не хочу, чтобы пользователь обновлял браузер sh, а использовал кнопку, предоставленную в пользовательском диалоге ошибок.

Это кажется достаточно простым, но я должен пропустить что-то важное. Метод close не возвращает обещание, но документы MDN утверждают, что он немедленно возвращается и закрывает базу данных в отдельном потоке. Я попытался определить простой приемник событий db.addEventListener( 'close', handler, false ) (как описано здесь ) перед использованием db.close(), но он никогда не вызывался. База данных закрывается, потому что после нажатия кнопки остальные действия базы данных перестают работать. Я хочу повторно открыть базу данных после ее закрытия, потому что это вызовет ряд шагов инициализации и попытается запустить fre sh без перезагрузки страницы.

Мой вопрос: как я могу прослушать событие базы данных close, прежде чем пытаться снова открыть базу данных, и как я могу узнать, произошел ли сбой метода close?

Спасибо.

function DB_restart() 
  { 
    DB.addEventListener( 'close', expected, false );
    DB.close();

    function expected( evt )
      {
        console.log( 'closed' );
        console.log( evt ); 
        // ... DB_open() ...
       }
} // close DB_restart

Я не заметил эта информация в MDN ранее, которая гласит, что событие close не срабатывает при использовании метода close, но только если оно неожиданно, на что @ Jo sh указал в ответе, который, кажется, имеет был впоследствии удален. Таким образом, вышеприведенное не сработает.

Возможно, поскольку в этом случае точно известно, что все транзакции закрыты, а close запрашивается перед новым open, закрытие всегда будет завершить первым. До сих пор в этом случае работал db.close(), за которым сразу же последовал вызов открытия базы данных.


После дальнейшей работы над этим кажется, что закрытие базы данных не является необходимым для моего простого случая перезапуск или сброс, по крайней мере, в Firefox. Цель состоит в том, чтобы повторно инициализировать переменные сопоставления так же, как при загрузке страницы без повторной загрузки страницы, и это инициируется событием onsuccess в IDBFactory.open(). Попытка открыть уже открытую базу данных, по-видимому, по-прежнему вызывает событие onsuccess, а не ошибку или игнорирует запрос. Поскольку я не меняю версию, если это нормальный ответ, закрывать не нужно. Похоже, что использование close непосредственно перед открытием тоже работает, потому что за последние пару дней он ни разу не допустил ошибок при тестировании; но в этом случае известно, что открытых транзакций для ожидания нет.

1 Ответ

0 голосов
/ 13 марта 2020

Чтобы прояснить несколько моментов:

  • Событие "close" происходит только при ненормальном закрытии - например, диск был отключен, обнаружено неустранимое повреждение, et c. Вызов close() из скрипта не сработает.

  • При вызове close() затем open() (без изменения версии) новое соединение может открыться до закрытия предыдущего соединения, если выполняются транзакции. Вы можете наблюдать это, запустив транзакцию с помощью al oop, которая выполняет новый запрос get (), когда предыдущий запрос завершается успешно (до тех пор, пока для логической переменной не задано значение true), оставьте его работающим, затем откройте новое соединение и останавливайте l oop (установив логическое значение в true) только после успешного открытия.

В целом, неясно, что вы спрашиваете. Если вы определили, что данные в самой базе данных являются плохими, вы, вероятно, захотите закрыть () и выполнить вызов deleteDatabase() и убедиться, что все ваши соединения выполняют close() в ответ на событие "versionchange", чтобы удалить не заблокирован После успешного удаления вы можете восстановить / заново заполнить базу данных.

...