Пытаясь отловить ошибки, связанные с запросами к базе данных 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 непосредственно перед открытием тоже работает, потому что за последние пару дней он ни разу не допустил ошибок при тестировании; но в этом случае известно, что открытых транзакций для ожидания нет.